MongoDB :: Order Search结果取决于搜索条件

时间:2015-10-30 10:39:59

标签: mongodb search

我有数据

[{ "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天后我遇到了这个问题。  感谢

1 个答案:

答案 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
    }
});