MongoDB通过使用Async.js来保持$in的顺序。
MongoDB通过使用Async.js来保持$in的顺序。
就像你知道的那样,{$in: {_id: []}}
不能保持顺序。我想使用Async.js来实现这个目的。例如:
const ids = [3,1,2]; // 初始的ids,我从聚合中获取 const documents = [{_id:1}, {_id:2}, {_id: 3}]; // 这是我从MongoDB中获取的 const result = [{_id:3}, {_id: 1}, {_id: 2}] // 这是我需要的
我应该如何使用Async.js来完成这个任务?我正在使用mongoose.js
和mongoose-fill,它与aggregation
不兼容。
问题的原因是需要在使用$in操作符查询MongoDB时保持查询结果的顺序。默认情况下,MongoDB在返回查询结果时并不保证结果的顺序与查询条件中的顺序一致。
解决方法是使用Async.js库来保持查询结果的顺序。Async.js是一个流行的JavaScript库,提供了许多用于处理异步操作的函数,例如并行执行、串行执行、流程控制等。
下面是使用Async.js解决这个问题的代码示例:
const async = require('async'); const MongoClient = require('mongodb').MongoClient; // 连接到MongoDB数据库 MongoClient.connect('mongodb://localhost:27017', function(err, client) { if (err) throw err; // 指定要查询的数据库和集合 const db = client.db('mydb'); const collection = db.collection('mycollection'); // 定义要查询的id列表 const ids = [1, 2, 3]; // 使用Async.js的mapSeries函数按顺序查询每个id对应的文档 async.mapSeries(ids, function(id, callback) { // 构建查询条件 const query = {_id: id}; // 执行查询 collection.findOne(query, function(err, document) { if (err) return callback(err); callback(null, document); }); }, function(err, results) { if (err) throw err; console.log(results); // 输出按顺序查询的结果 // 关闭数据库连接 client.close(); }); });
这段代码首先连接到MongoDB数据库,然后指定要查询的数据库和集合。接下来,定义要查询的id列表,并使用Async.js的mapSeries函数按顺序查询每个id对应的文档。最后,输出按顺序查询的结果,并关闭数据库连接。
希望这对你有帮助。