MongoDB $in查询的响应顺序是什么?
MongoDB $in查询的响应顺序是什么?
MongoDB文档中关于$in条件运算符没有提到顺序。如果我运行一个形式如下的查询:
db.things.find({'_id': {'$in': id_array}});
返回结果的顺序将是什么?我是否有办法告诉MongoDB“我希望结果按照id_array
中的id的顺序排序?”
MongoDB的$in查询在返回结果时并不能保证与查询的顺序一致,这可能会导致结果的顺序与预期不符。为了解决这个问题,一个解决方法是创建一个哈希映射,将查询数组中的ID与从MongoDB返回的结果数组进行映射。
具体做法是遍历结果数组,对于每个结果项,创建一个新的键值对:键是该项的ID,值是结果对象。这样,在想要按照查询顺序遍历结果时,可以使用哈希映射来获取正确的对象,而无需进行排序或使用MongoDB的其他高级选项。
在JavaScript中,可以按照以下方式实现:
// 想要的顺序 var queryIds = [ 8, 5, 3, 7 ]; // 从MongoDB返回的结果,顺序未定义 var resultsFromMongoDB = [ {_id: 7, data: "d" }, {_id: 8, data: "a" }, {_id: 5, data: "b" }, {_id: 3, data: "c" }, ]; // 创建哈希映射的函数 function createHashOfResults( results ){ var hash = {}; for( var i = 0 ; i < results.length ; i++ ){ var item = results[i]; var id = item._id; hash[ id ] = item; } return hash; } // 创建哈希映射 var hash = createHashOfResults( resultsFromMongoDB ); // 按照想要的顺序显示结果 for( var i = 0 ; i < queryIds.length ; i++ ){ var queryId = queryIds[i]; var result = hash[queryId]; console.log( result.data ); }
这将显示:
a b c d
需要注意的是,如果数据量非常大,这种方法可能会占用大量内存。如果目标是按照顺序获取结果,可以参考这个解决方案:stackoverflow.com/questions/22797768/…
问题的出现的原因是希望根据给定的顺序返回MongoDB查询的结果,但是MongoDB的$in查询操作并不保证结果的顺序与查询条件中的顺序一致。为了解决这个问题,可以使用Array.reduce和Array.map方法进行优化。
解决方法如下所示:
//The order you want var queryIds = [8, 5, 3, 7]; //The results from MongoDB in an undefined order var resultsFromMongoDB = [ {_id: 7, data: "d"}, {_id: 8, data: "a"}, {_id: 5, data: "b"}, {_id: 3, data: "c"} ]; var reorderedResults = naturalOrderResults(resultsFromMongoDB, queryIds); function naturalOrderResults(resultsFromMongoDB, queryIds) { //Let's build the hashmap var hashOfResults = resultsFromMongoDB.reduce(function (prev, curr) { prev[curr._id] = curr; return prev; }, {}); return queryIds.map( function(id) { return hashOfResults[id] } ); }
这段代码使用了reduce方法创建了一个哈希映射,将查询结果按照_id字段进行索引。然后使用map方法根据给定的顺序返回结果。
通过这种方式,可以确保查询结果的顺序与查询条件中的顺序一致,避免了性能问题。这种方法对于大量数据的查询尤其有用。
希望这个解决方法对你有所帮助!