【问题标题】:Select records matching concat value of two fields in mongodb选择匹配mongodb中两个字段的concat值的记录
【发布时间】:2014-07-09 19:39:28
【问题描述】:

有没有办法在 MongoDB 上做这样的事情?

select * from table where concat(field1, field2) = 'value'

为了澄清,我有一个全名数组,但文件的名字和姓氏是分开的,所以我想做这样的事情:

select * from table where concat(firstname, lastname) in ([ARRAY OF NAMES])

【问题讨论】:

    标签: mongodb concat


    【解决方案1】:

    您只能使用聚合框架来做到这一点,而不能使用常规查找。

    db.coll.aggregate({$project:{newField:{$concat:["$field1","$field2"]}}},
                      {$match:{newField:"value"}} 
    );
    

    请注意,这将无法使用任何索引,因为 MongoDB 中不支持计算值的索引(目前)。

    如果您在 field1 上有一个索引,并且您知道您希望 field1 为 value 贡献多少字符,您可以像这样提高此聚合的性能:

    db.coll.aggregate({$match:{field1:/^val/}},
                      {$project:{newField:{$concat:["$field1","$field2"]}}},
                      {$match:{newField:"value"}} 
    );
    

    其中val 是“值”字符串的第一部分(不过,您不能比较比field1 的最短可能值更多的字符。

    EDIT 从 3.6 版开始,您可以使用 $expr 表达式在 find 中执行此操作:

    db.coll.find({$expr:{$eq:["value", {$concat:["$field1", "$field2"]}]}})
    

    【讨论】:

    • 太棒了,这几乎是我所需要的:检查我的编辑,如何将 $match 变成“in (array)”?
    • nvm,找到了 $in 运算符!
    • 在 mongodb 聚合中的链接就是它的所在!
    • @AsyaKamsky - 如何使用 MongoDB.Drivers 在 C# 中实现同样的功能
    • 请单独询问 C#。
    【解决方案2】:

    如果参数($field1 或 $field2)解析为 null 值或引用缺少的字段,则 $concat 返回 null。从 mongoDB3.0 开始,提供了一个新的 $ifNull 来检查参数是否为 null 并提供替代方法

    { $ifNull: [ <expression>, <replacement-expression-if-null> ] }
    
    db.coll.aggregate({$project:{newField:{$concat:[{$ifNull:["$field1",""]},{$ifNull:["$field2",""]}]}}},
                  {$match:{newField:"value"}})
    

    如果我们使用 $match,结果可能不会不同,但如果您想使用 $regex,结果会有所不同。

    【讨论】:

      【解决方案3】:

      在 Mongoose 中你可以喜欢它

      let clause =  [                                               
                  {$project:{name:{$concat["$first_name"," ","$last_name"]}}},
                  {$match:{name:new RegExp("ab", 'i')}}                       
               ];                                                                             
      Model.aggregate(clause)
      

      OutPut 会是这样的

      [
      {
          "_id": "5911db2b9235272052fdd2e1",
          "name": "Ali Abbas"
      },
      {
          "_id": "5912f7dd8bdbc24aa37b5239",
          "name": "Ali Abad"
      },
      {
          "_id": "59229e0322abdb311818e419",
          "name": "Syed Ali Abbas Shah"
      },
      {
          "_id": "592837da188fa969cc135ddc",
          "name": "Abu Akbar"
      }
      

      ]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多