MongoDB และ nodejs ค้นหารายการรหัสทั้งหมด

ฉันมีสองคอลเลกชัน: ผู้ใช้:

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

เอกสาร:

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

ฉันต้องการรับเอกสารจากรหัส ฉันลองใช้วิธีแก้ปัญหานี้ แต่ได้รับข้อความนี้:

{ db: { โดเมน: null, _events: {}, _maxListeners: 10, ชื่อฐานข้อมูล: 'ทดสอบ', ...


person Denis Baskovsky    schedule 01.06.2013    source แหล่งที่มา
comment
เพิ่มตัวอย่างโค้ดเกี่ยวกับวิธีการค้นหาเอกสารของคุณ ข้อความของคุณดูเหมือนเคอร์เซอร์ mongodb ส่งกลับจาก find โดย ไดรเวอร์ mongodb ดั้งเดิม   -  person Leonid Beschastny    schedule 01.06.2013
comment
var idsProjects = [512d5793abb900bf3e000002, 512d5793abb900bf3e000001] collectionProjects.find({_id: {$in:idsProjects}},{_id: 0, ชื่อ: 1 }, ฟังก์ชั่น (ข้อผิดพลาด, ข้อมูล){....   -  person Denis Baskovsky    schedule 01.06.2013
comment
find() ส่งคืนเคอร์เซอร์ คุณต้องวนซ้ำชุดผลลัพธ์หรือเพิ่ม .toArray() เพื่อให้กลับมาเป็นอาร์เรย์   -  person Asya Kamsky    schedule 01.06.2013
comment
คุณใช้ไดรเวอร์ mongodb ดั้งเดิมหรือมีตัวหุ้มอยู่รอบ ๆ หรือไม่?   -  person Leonid Beschastny    schedule 01.06.2013
comment
ใช่. ฉันใช้ github.com/mongodb/node-mongodb-native   -  person Denis Baskovsky    schedule 01.06.2013
comment
โอเค ฉันจะเขียนวิธีแก้ปัญหาให้คุณภายในไม่กี่นาที   -  person Leonid Beschastny    schedule 01.06.2013


คำตอบ (2)


ข้อความของคุณดูเหมือน เคอร์เซอร์ mongodb ที่ส่งคืนจากการค้นหาโดย ไดรเวอร์ 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 ดั้งเดิมไปเป็น wrapper รอบๆ เช่น monk

person Leonid Beschastny    schedule 01.06.2013

หากคุณสนใจลำดับของรายการ คำตอบของ Mr.Leonid อาจไม่เป็นไปตามที่คาดไว้

นั่นเป็นเพราะว่า find ได้รับเอกสารที่มี _id เท่ากับ _ids ใด ๆ $in ในรายการ ดังนั้นเอกสารเอาต์พุตจะถูกเรียงลำดับตามลำดับหลักของคอลเลกชัน ไม่ใช่ลำดับของรายการอินพุต

เพื่อแก้ปัญหานั้นคุณสามารถใช้ 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);
person Abdelazeem Kuratem    schedule 26.11.2020