1

我使用 Mongodb 和我的数据库模式,如下所示:

firstName: 'vahid',
lastName: 'kh',
age: 12 

我想找到名字+姓氏喜欢'vahid kh'的所有记录。在 SQL 中,这将是:

Select * from table where firstName + lastName like '%vahid kh%'

4

4 回答 4

3

似乎这仅在今天发布的 2.4 中可用。

> db.temp.save({ "firstName" : "Bob", "lastName" : "Smith", Age : 12 });
> db.temp.find();
{ "_id" : ObjectId("5148a2a00477cddcdece1b34"), "firstName" : "Bob", "lastName" : "Smith", "Age" : 12 }
> db.temp.aggregate({ $project : { "name" : { $concat : [ "$firstName", " ", "$lastName" ] } } });
{
    "result" : [
       {
           "_id" : ObjectId("5148a2a00477cddcdece1b34"),
           "name" : "Bob Smith"
       }
    ],
    "ok" : 1
} 
于 2013-03-19T17:43:30.410 回答
1

你可以使用$regex,这样你就可以使用部分匹配。像这样的东西:

db.collection.find( { field: /acme.*corp/i } )

这是与 php 中的答案有些相似的问题:MongoRegex and search multiple rows in collection

关于 mongoregex 的文档在这里:http ://docs.mongodb.org/manual/reference/operator/regex/

编辑:

我刚刚在 sql 中使用查询阅读了您的评论。简单的解决方案可能是创建字段fullname并使用 搜索它$regex,这是一种数据库非规范化,您可以在其中存储一些冗余数据。

甚至更简单,这也应该可以完成工作:

db.collection.find( { firstName: /*vahid/i, lastName: /kh*/i } )
于 2013-03-19T17:48:43.543 回答
1

要搜索两个或多个字段的组合,您需要使用聚合框架。它允许您按字段组合进行排序,并且您不需要存储(非规范化)任何额外的字段:

db.collection.aggregate([
{
    $match: {
        // Optional criteria to select only some documents to process, such as...
        deleted: null
    }
},
{
    $addFields: {
        // Need to prefix fields with '$'
        fullName: { $concat: [ "$firstName", "$lastName" ] },
    }
},
{
    $search: { fullName: /.*vakid kh.*/ },
}
]);

解释:

  • $addFields聚合管道阶段创建动态的动态字段
  • $concatfullName通过连接名字和姓氏来创建字段
  • $search执行正则表达式 search,这是 MongoDB 等价于 SQLLIKE运算符。
于 2019-05-24T21:57:09.300 回答
0

我在 expressjs 代码聚合中的代码有点慢然后找到,所以我使用基于条件和使用正则表达式来查找真实结果,我正在与您分享 nodejs 代码,希望它对您或我的其他代码爱好者朋友有用。

router.get('/publisher/:q',function(req,res){

  var q = ucfirst( req.params['q'] );
  var qSplit = q.split(" ");
  var db = mongojs(CONNECTION_STRING, ['tags_helper','users']);
  var query = { "status" : 1, isAdmin : { $exists : false } };

  console.log(qSplit);

  if( qSplit.length > 1  )
  {

    query["firstName"] = new RegExp(qSplit[0],"i");
    query["lastName"] =  new RegExp(qSplit[1],"i");

  }
  else
  {
    qSplit[0] = new RegExp(qSplit[0],"i");
    qSplit[1] = new RegExp(qSplit[0],"i"); 

    //query.push( { $or : [  {"firstName": new RegExp(q,"i")},{"lastName": new RegExp(q,"i")} ]  } );
    query["$or"] = [  {"firstName": new RegExp(q,"i")},{"lastName": new RegExp(q,"i")} ];
  }

  db.users.find( query,{_id : 1,firstName:1,lastName:1,image:1,profileName:1}).limit(10,function (err, users) {

    //TODO your further code .. 


  });
});

祝您编码愉快。

于 2016-04-04T06:32:44.360 回答