根据字段值中的第一个字符对文档进行排序

时间:2016-06-21 02:51:05

标签: regex mongodb mongodb-query aggregation-framework

我有一组这样的数据:

[{name: "ROBERT"}, {name: "PETER"}, {name: "ROBINSON"} , {name: "ABIGAIL"}]

我想创建一个可以找到的mongodb查询:

  1. 任何名称以字母“R”(正则表达式:^ R)
  2. 开头的数据
  3. 后跟任何名称包含字母“R”的数据不是第一个字符,如:peteR,adleR或caRl
  4. 因此产生:

    [{name: "ROBERT"}, {name: "ROBINSON"}, {name: "PETER"}]
    

    它基本上只显示包含“R”字符的任何数据,但我想对其进行排序,以便在其余部分之前显示带有“R”作为第一个字符的数据

    到目前为止,我已经提出了2个单独的查询,然后是一个操作,以消除任何重复的结果,然后加入它们。那么有没有更有效的方法在mongo中做到这一点?

2 个答案:

答案 0 :(得分:2)

您想要的是为文档添加weight并相应地对其进行排序。

首先,您需要选择使用正则表达式$match您的标准的文档。

为此,您需要$project您的文件并添加"重量"基于使用逻辑$cond ition处理的字符串的第一个字符的值。

此处的条件为$eq,如果名称中第一个字符的小写字母为" r"则将{em> weight 1添加到文档中。如果不是,则为0。

当然$substr$toLower字符串聚合运算符分别返回小写的第一个字符。

最后,按重量递减$sort您的文件。

db.coll.aggregate(
    [
        { "$match": { "name": /R/i  } }, 
        { "$project": { 
            "_id": 0, 
            "name": 1, 
            "w": { 
                "$cond": [ 
                    { "$eq": [ 
                        { "$substr": [ { "$toLower": "$name" }, 0, 1 ] }, 
                        "r" 
                    ]}, 
                    1, 
                    0
                ]
            }
        }}, 
        { "$sort": { "w": -1 } } 
    ] 
)

产生:

{ "name" : "ROBERT", "w" : 1 }
{ "name" : "ROBINSON", "w" : 1 }
{ "name" : "PETER", "w" : 0 }

答案 1 :(得分:0)

试试这个:

db.collectioname.find ("name":/R/)