如何获得所有的值,包含一个字符串的一部分使用猫鼬发现?

我在使用猫鼬从 MongoDB 检索数据时遇到了以下问题。

以下是我的模式:

const BookSchema = new Schema(
{
_id:Number,
title:String,
authors:[String],
subjects:[String]
}
);

你可以看到我在对象中嵌入了两个数组,让我们假设作者的内容是这样的: 作者: [“亚历克斯 · 弗格森”,“迪迪埃 · 德罗巴”,“基斯坦奴·朗拿度”,“亚历克斯”]
我要做的就是让所有的 Alex 都进入数组。

到目前为止,我已经能够得到的值,如果他们完全匹配的值。然而,如果我试图得到那些包含亚历克斯的答案总是[]。

我想知道的是,如何在不执行 map-reduce 的情况下使用 find ()来创建视图或集合,然后在其上应用 find ()。

这里的代码适用于精确匹配

Book.find( {authors:req.query.q} , function(errs, books){
if(errs){
res.send(errs);
}


res.json(books);
});

我尝试了一些事情,但是没有运气 { author: { $elemMatch: req.query.q }} { author: { $in: [ req.query.q ]}}

这个给了我一个错误,最重要的是,说是非常低效的另一个职位,我在这里发现。 { $where: this. authors.indexOf (req.query.q) ! = -1}

我还尝试了{ author: { $regex: “ ./价值/i”}}

Map-reduce 工作得很好,我需要使用另一种方法来看看哪种方法更好?

非常感谢您的帮助。我知道这很简单,但是我刚接触 NodeJS 和 Mongo,我还没能自己弄明白。

113869 次浏览

你的标签差点就回答了这个问题。MongoDB 有一个 强 > $regex操作符,它允许将正则表达式作为查询提交。因此,如果查询包含“ Alex”的字符串,则执行以下操作:

Books.find(
{ "authors": { "$regex": "Alex", "$options": "i" } },
function(err,docs) {
}
);

你也可以这样做:

Books.find(
{ "authors": /Alex/i },
function(err,docs) {


}
);

这两种方法都是有效的,并且与您在文档中所示的正确支持语法中的尝试方法不同。

当然,如果您实际上是在问“如何只获得字符串中某处与‘ Alex’匹配的‘ array’结果?”那这个就有点不一样了。

对于多于 数组元素的复杂匹配是 聚合框架(或者可能是 mapReduce,但是速度要慢得多)的域,您需要在其中“过滤”数组内容。

你开始的时候也差不多。这里的关键是 强 > $unwind对数组内容进行“反规范化”,以便能够作为单个文档进行正确的“过滤”。然后用“匹配”文档重新构造数组。

Books.aggregate(
[
// Match first to reduce documents to those where the array contains the match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},


// Unwind to "de-normalize" the document per array element
{ "$unwind": "$authors" },


// Now filter those document for the elements that match
{ "$match": {
"authors": { "$regex": "Alex", "$options": i }
}},


// Group back as an array with only the matching elements
{ "$group": {
"_id": "$_id",
"title": { "$first": "$title" },
"authors": { "$push": "$authors" },
"subjects": { "$first": "$subjects" }
}}
],
function(err,results) {


}
)

查找标题包含: coolcase insensitive匹配的文章: (Very Cool也有 cool)

const s = 'cool'
const regex = new RegExp(s, 'i') // i for case insensitive
Posts.find({title: {$regex: regex}})

使用猫鼬和 $regex 进行实时搜索

下面是从搜索文本开始获取图书的查询。

var result = await Books.find({ 'authors': { $regex: '^' + search_text, $options: 'i' } }).exec();