MongoDB $in查询的响应顺序是什么?

19 浏览
0 Comments

MongoDB $in查询的响应顺序是什么?

MongoDB文档中关于$in条件运算符没有提到顺序。如果我运行一个形式如下的查询:

db.things.find({'_id': {'$in': id_array}});

返回结果的顺序将是什么?我是否有办法告诉MongoDB“我希望结果按照id_array中的id的顺序排序?”

0
0 Comments

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/…

0
0 Comments

问题的出现的原因是希望根据给定的顺序返回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方法根据给定的顺序返回结果。

通过这种方式,可以确保查询结果的顺序与查询条件中的顺序一致,避免了性能问题。这种方法对于大量数据的查询尤其有用。

希望这个解决方法对你有所帮助!

0