如何使用mongoose发现所有包含一部分string的值?

我有以下问题使用mongoose从MongoDB中检索数据。

这是我的模式:

你可以看到我有2个数组embedded对象,让我们说,作者的内容可以是这样的:作者:[“亚历克斯·弗格森”,“德罗巴”,“克里斯蒂亚诺罗纳尔多”,“亚历克斯”]
我想要实现的是获得arrays中的所有Alex。

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

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

这里的代码适用于完全匹配

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

我尝试了一些东西,但没有运气{作者:{$ elemMatch:req.query.q}} {作者:{$ in:[req.query.q]}}

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

我也试过{作者:{$ regex:“./ value / i”}}

map-reduce工作正常,我需要使用其他方法来查看哪个更好?

任何帮助是极大的赞赏。 我确信这很容易,但是我是NodeJS和Mongo的新手,我一直无法自己搞清楚。

       

网上收集的解决方案 "如何使用mongoose发现所有包含一部分string的值?"

你几乎在你的标签中回答这个问题。 MongoDB有一个$regex运算符,允许正则expression式作为查询提交。 所以你查询包含“亚历克斯”的string,你这样做:

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

你也可以这样做:

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

两者都是有效的,不同于你如何以正确的支持语法尝试,如文档中所示。

但是当然,如​​果你实际上是在问“如何获得'数组'的结果,只有那些匹配'Alex'的string的地方? 那么这有点不同。

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

你开始的很多。 这里的关键是$unwind数组内容的“反规范化”,以便能够适当地“过滤”为单个文档。 然后用“匹配”文件重新构build数组。

 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) { } )