0

我有两个集合:用户:

{
  _id: ObjectId('123...'),
  docs: [
    ObjectId('512d5793abb900bf3e000002'),
    ObjectId('512d5793abb900bf3e000001')
  ]
}

文档:

{
  _id: ObjectId('512d5793abb900bf3e000002'),
  name: 'qwe',
  ...
}
{
  _id: ObjectId('512d5793abb900bf3e000001'),
  name: 'qwe2',
  ...
}

我想从 ids 获取文档。我尝试了这个解决方案,但我收到了这条消息:

{ db: { domain: null, _events: {}, _maxListeners: 10, databaseName: 'test', ...

4

2 回答 2

2

您的消息看起来像本地 mongodb 驱动程序从 find 返回的mongodb 游标

要获取实际数据,您应该使用toArray游标的功能:

var ObjectID = require('mongodb').ObjectID;
// you shall wrap each id in ObjectID
var idsProjects = [
  ObjectID('512d5793abb900bf3e000002'),
  ObjectID('512d5793abb900bf3e000001')
];
collectionProjects.find({
  _id: { $in: idsProjects }
},{
  _id: -1, // use -1 to skip a field
  name: 1
}).toArray(function (err, docs) {
  // docs array here contains all queried docs
  if (err) throw err;
  console.log(docs);
});

但我建议你从本地 mongodb 驱动程序切换到像 Mongodb 这样的包装

于 2013-06-01T09:07:02.597 回答
0

如果您关心列表的顺序,Leonid 先生的答案可能无法按预期工作。

这是因为find获取具有 _id 的文档等于$in列表中的任何 _ids,因此输出文档将按集合本身的主顺序而不是输入列表的顺序进行排序。

要解决这个问题,您可以使用findOne带有 for 循环的正常列表。

代码将如下所示:

var ObjectID = require('mongodb').ObjectID;
var idsProjects = [
  '512d5793abb900bf3e000002',
  '512d5793abb900bf3e000001'
];
let usersList = new Array();

for (let index = 0; index < idsProjects.length; index++) {
    const myID = idsProjects[index];
    
    const query = { _id: ObjectID(myID) };
    const options = {
    projection: {name: 1 };
    
    var user= await collectionProjects.findOne(query,options);
    
    usersList.push(user);
}

// that's it,
// here we have a list of users 'usersList' 
//with same order of the input ids' list.
console.log(usersList);
于 2020-11-26T19:39:13.953 回答