我有数据
[{ "name":"BS",
"keyword":"key1",
"city":"xyz"
},
{ "name":"AGS",
"keyword":"Key2",
"city":"xyz1"
},
{ "name":"QQQ",
"keyword":"key3",
"city":"xyz"
},
{ "name":"BS",
"keyword":"Keyword",
"city":"city"
}]
我需要在查询的帮助下搜索名称=“BS”OR keyword =“key2”的记录
db.collection.find({"$OR" : [{"name":"BS"}, {"keyword":"Key2"}]});
我在序列中需要的这些记录
[{ "name":"BS",
"keyword":"key1",
"city":"xyz"
},
{ "name":"BS",
"keyword":"Keyword",
"city":"city"
},
{ "name":"AGS",
"keyword":"Key2",
"city":"xyz1"
}]
但我接受以下序列:
[{ "name":"BS",
"keyword":"key1",
"city":"xyz"
},
{ "name":"AGS",
"keyword":"Key2",
"city":"xyz1"
},
{ "name":"BS",
"keyword":"Keyword",
"city":"city"
}]
请提供一些建议,因为2天后我遇到了这个问题。 感谢
答案 0 :(得分:0)
除非使用sort
函数明确对数据进行排序,否则无法保证MongoDB返回的结果顺序。对于较小的数据集,您可能“幸运”,因为结果总是以相同的顺序返回,但是,对于更大的数据集,特别是当您有分片的Mongo集群时,这是不太可能的。根据Yathish的建议,您需要使用sort
函数明确地对结果进行排序。根据建议的输出,您似乎希望按名称按降序排序,因此我已将字段-1
的排序标记设置为name
。
db.collection.find({"$or" : [{"name":"BS"}, {"keyword":"Key2"}]}).sort({"name" : -1});
如果您需要评论中指定的更复杂的排序算法,则可以将结果转换为Javascript数组并创建自定义排序功能。此排序函数将首先列出name
等于“BS”的文档,然后列出包含keyword
“Key2”的文档
db.data.find({
"$or": [{
"name": "BS"
}, {
"keyword": "Key2"
}]
}).toArray().sort(function(doc1, doc2) {
if (doc1.name == "BS" && doc2.keyword == "Key2") {
return -1
} else if (doc2.name == "BS" && doc1.keyword == "Key2") {
return 1
} else {
return doc1.name < doc2.name
}
});