mongodb / mongoose findMany – encontre todos os documentos com IDs listados na matriz

Eu tenho uma matriz de _ids e quero obter todos os documentos de acordo, qual é a melhor maneira de fazer isso?

Algo como …

// doesn't work ... of course ... model.find({ '_id' : [ '4ed3ede8844f0f351100000c', '4ed3f117a844e0471100000d', '4ed3f18132f50c491100000e' ] }, function(err, docs){ console.log(docs); }); 

O array pode conter centenas de _ids.

A function find em mangusto é uma consulta completa ao mongoDB. Isso significa que você pode usar a conveniente cláusula mongoDB $in , que funciona exatamente como a versão SQL do mesmo.

 model.find({ '_id': { $in: [ mongoose.Types.ObjectId('4ed3ede8844f0f351100000c'), mongoose.Types.ObjectId('4ed3f117a844e0471100000d'), mongoose.Types.ObjectId('4ed3f18132f50c491100000e') ]} }, function(err, docs){ console.log(docs); }); 

Esse método funcionará bem mesmo para matrizes contendo dezenas de milhares de ids. (Consulte Determinar com eficiência o proprietário de um registro )

Eu recomendaria que qualquer pessoa que trabalhasse com o mongoDB lesse a seção Consultas Avançadas do excelente Documento Oficial mongoDB

Use este formato de consulta

 let arr = _categories.map(ele => new mongoose.Types.ObjectId(ele.id)); Item.find({ vendorId: mongoose.Types.ObjectId(_vendorId) , status:'Active'}) .where('category') .in(arr) .exec(); 

Tanto o node.js quanto o MongoChef me forçam a converter para o ObjectId. Isto é o que eu uso para pegar uma lista de usuários do database e buscar algumas propriedades. Mente a conversão de tipo na linha 8.

 // this will complement the list with userName and userPhotoUrl based on userId field in each item augmentUserInfo = function(list, callback){ var userIds = []; var users = []; // shortcut to find them faster afterwards for (l in list) { // first build the search array var o = list[l]; if (o.userId) { userIds.push( new mongoose.Types.ObjectId( o.userId ) ); // for the Mongo query users[o.userId] = o; // to find the user quickly afterwards } } db.collection("users").find( {_id: {$in: userIds}} ).each(function(err, user) { if (err) callback( err, list); else { if (user && user._id) { users[user._id].userName = user.fName; users[user._id].userPhotoUrl = user.userPhotoUrl; } else { // end of list callback( null, list ); } } }); }