MongoDB/Mongoose FindMany - Finden Sie alle Dokumente mit in Array aufgeführten IDs
Frage
Ich habe eine Reihe von _ids und möchte alle Dokumente entsprechend bekommen. Was ist der beste Weg, dies zu tun?
Etwas wie ...
// doesn't work ... of course ...
model.find({
'_id' : [
'4ed3ede8844f0f351100000c',
'4ed3f117a844e0471100000d',
'4ed3f18132f50c491100000e'
]
}, function(err, docs){
console.log(docs);
});
Das Array könnte Hunderte von _ids enthalten.
Lösung
Das find
Die Funktion in Mongoose ist eine vollständige Abfrage nach MongoDB. Dies bedeutet, dass Sie den handlichen MongoDB verwenden können $in
Klausel, die genau wie die SQL -Version derselben funktioniert.
model.find({
'_id': { $in: [
mongoose.Types.ObjectId('4ed3ede8844f0f351100000c'),
mongoose.Types.ObjectId('4ed3f117a844e0471100000d'),
mongoose.Types.ObjectId('4ed3f18132f50c491100000e')
]}
}, function(err, docs){
console.log(docs);
});
Diese Methode funktioniert auch für Arrays, die Zehntausende von IDs enthalten. (Sehen Den Eigentümer eines Datensatzes effizient bestimmen)
Ich würde empfehlen, dass jeder arbeitet, mit dem mongoDB
Lesen Sie durch die Fortgeschrittene Fragen Abschnitt der ausgezeichneten Offizielle MongoDB -Dokumente
Andere Tipps
Verwenden Sie dieses Format der Abfrage
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();
Sowohl Node.js als auch Mongochef zwingen mich, in ObjectID zu konvertieren. Dies ist es, was ich benutze, um eine Liste von Benutzern aus der DB zu holen und ein paar Eigenschaften zu holen. Achten Sie auf die Typumwandlung in Zeile 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 );
}
}
});
}
IDS ist das Array von Objekt -IDs:
const ids = [
'4ed3ede8844f0f351100000c',
'4ed3f117a844e0471100000d',
'4ed3f18132f50c491100000e',
];
Verwenden von Mongoose mit Rückruf:
Model.find().where('_id').in(ids).exec((err, records) => {});
Verwenden von Mongoose mit asynchronisierter Funktion:
records = await Model.find().where('_id').in(ids).exec();
Vergessen Sie nicht, das Modell mit Ihrem tatsächlichen Modell zu ändern.