我有一组这样的数据:
[{name: "ROBERT"}, {name: "PETER"}, {name: "ROBINSON"} , {name: "ABIGAIL"}]
我想创建一个可以找到的mongodb查询:
因此产生:
[{name: "ROBERT"}, {name: "ROBINSON"}, {name: "PETER"}]
它基本上只显示包含“R”字符的任何数据,但我想对其进行排序,以便在其余部分之前显示带有“R”作为第一个字符的数据
到目前为止,我已经提出了2个单独的查询,然后是一个操作,以消除任何重复的结果,然后加入它们。那么有没有更有效的方法在mongo中做到这一点?
答案 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/)