362 Stimmen

mongodb/mongoose findMany - findet alle Dokumente, deren IDs in einem Array aufgeführt sind

Ich habe ein Array von _ids und ich möchte alle Dokumente entsprechend zu erhalten, was ist der beste Weg, es zu tun?

Etwas wie ...

// doesn't work ... of course ...

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

Das Array kann Hunderte von _ids enthalten.

661voto

Daniel Mendel Punkte 9547

Les find Funktion in mongoose ist eine vollständige Abfrage an mongoDB. Das bedeutet, dass Sie die praktische mongoDB $in Klausel, die genau wie die SQL-Version desselben 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 bei Arrays mit Zehntausenden von IDs. (Siehe Effiziente Ermittlung des Eigentümers eines Datensatzes )

Ich würde jedem empfehlen, der mit mongoDB lesen Sie die Erweiterte Abfragen Abschnitt des ausgezeichneten Offizielle mongoDB-Dokumente

173voto

snnsnn Punkte 5058

Ids ist das Array der Objekt-IDs:

const ids =  [
    '4ed3ede8844f0f351100000c',
    '4ed3f117a844e0471100000d', 
    '4ed3f18132f50c491100000e',
];

Verwendung von Mongoose mit Rückruf:

Model.find().where('_id').in(ids).exec((err, records) => {});

Verwendung von Mongoose mit asynchroner Funktion:

const records = await Model.find().where('_id').in(ids).exec();

Oder noch prägnanter:

const records = await Model.find({ '_id': { $in: ids } });

Vergessen Sie nicht, Model durch Ihr aktuelles Modell zu ersetzen.

24voto

Ahmad Agbaryah Punkte 447

Kombination der Antworten von Daniel und snnsnn:

let ids = ['id1', 'id2', 'id3'];
let data = await MyModel.find({
  '_id': { 
    $in: ids
  }
});

Einfacher und sauberer Code. Es funktioniert und getestet gegen:

"mongodb": "^3.6.0",
"mongoose": "^5.10.0",

13voto

Derese Getachew Punkte 430

Verwenden Sie diese Form 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();

10voto

fafa.mnzm Punkte 451

Dieser Code funktioniert bei mir ab mongoDB v4.2 und mongoose 5.9.9 einwandfrei:

const Ids = ['id1','id2','id3']
const results = await Model.find({ _id: Ids})

und die Ids können vom Typ ObjectId o String

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X