如何用MongoDB的名字和姓氏search用户?

我有一个用户的基本集合,有他们的firstNamelastName和一些其他的细节。

我如何简单地通过两个名称的组合来search用户,还是部分search?

例如,对于以下集合:

 { firstName: Bob, lastName: Jerry }, { firstName: Clark, lastName: Mcbobby } 

如果search词是bob ,那么这两个用户都将被返回,因为第一个文档firstName是bob,最后一个用户lastName包含bob 。 如果bob j是search词, bob j返回第一个文档,因为如果这两个名字是组合的,则等同于与search词相匹配的Bob Jerry

我尝试创build一个基本的aggregate来连接名称,然后进行匹配,尽pipeMongoose一直抛出一个错误: Arguments must be aggregate pipeline operators

这是我现在的代码:

 User.aggregate({ $project: { "name" : { $concat : [ "$firstName", " ", "$lastName" ] } }, $match: {"name": {$regex: "/bob j/i"}} }).exec(function(err, results) { ... }); 

我在你的代码中看到了一些错误,导致了不希望的结果。

  1. 聚合pipe道接受数组聚合框架操作。 在你的情况下,你是失踪[]运营商。 应该是这样的

    User.aggregate([{$project...},{$match...}])

  2. 在$ match阶段,你使用的是正则expression式,如果你使用的是正则expression式的风格,你不需要用string引号来包装它。 应该是/bob j/i

这里是完成的例子:

 User.aggregate([ {$project: { "name" : { $concat : [ "$firstName", " ", "$lastName" ] } }}, {$match: {"name": {$regex: /bob j/i}}} ]).exec(function(err, result){ console.log(result); }); 

你应该在屏幕上看到[ { _id: 574c3e20be214bd4078a9149, name: 'Bob Jerry' } ]

聚合函数的参数必须是包含stream水线阶段文档的数组

 var query = 'bob j'; Users.aggregate([ //pipeline array {$project:{name: { $concat : [ "$firstName", " ", "$lastName" ] }}}, //stage1 {$match : { name: { $regex: query, $options:'i'}}} //stage2 ]) 

您不需要使用聚合框架来select文件,其中给定值是在“firstName”或“lastName”中。

 var reg = new RegExp(/bob/, 'i'); User.find({ '$or': [ { 'firstName': reg }, { 'lastName': reg } ] }).exec(function(err, results) { // Do something } 

如果你想要基于连接值,那么:

 User.aggregate([ { "$project": { "name": { "$concat" : [ "$firstName", " ", "$lastName" ] } } }, { "$match" : { "name": /bob j/i } } ]).exec(function(err, results) { // Do something } 

您可以使用$或( 请参阅文档 )

 User.find({ $or: [ {$match: {"firstName": {$regex: "/bob j/i"}}}, {$match: {"lastName": {$regex: "/bob j/i"}}} ] }); 

没有testing