MongoDB通过使用Async.js来保持$in的顺序。

18 浏览
0 Comments

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.jsmongoose-fill,它与aggregation不兼容。

0
0 Comments

问题的原因是需要在使用$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对应的文档。最后,输出按顺序查询的结果,并关闭数据库连接。

希望这对你有帮助。

0