如何用MongoDB的名字和姓氏search用户?
我有一个用户的基本集合,有他们的firstName
, lastName
和一些其他的细节。
我如何简单地通过两个名称的组合来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) { ... });
我在你的代码中看到了一些错误,导致了不希望的结果。
-
聚合pipe道接受数组聚合框架操作。 在你的情况下,你是失踪
[]
运营商。 应该是这样的User.aggregate([{$project...},{$match...}])
-
在$ 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