it-swarm.com.de

mongodb / mongoose findMany - findet alle Dokumente mit IDs, die im Array aufgelistet sind

Ich habe eine Reihe von _ids und möchte alle Dokumente entsprechend abrufen. Wie geht das am besten?

So etwas wie ...

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

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

Das Array enthält möglicherweise Hunderte von _ids.

210
ezmilhouse

Die Funktion find in mongoose ist eine vollständige Abfrage an mongoDB. Das heißt, Sie können die handliche mongoDB $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 eignet sich auch für Arrays mit Zehntausenden von IDs. (Siehe Den Besitzer eines Datensatzes effizient bestimmen )

Ich würde jedem empfehlen, der mit mongoDB arbeitet, den Abschnitt Advanced Queries des excellent Official mongoDB Docs durchzulesen

418
Daniel Mendel

Verwenden Sie dieses Abfrageformat

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();
8
Derese Getachew

Sowohl node.js als auch MongoChef zwingen mich, in ObjectId zu konvertieren. Dies ist, was ich benutze, um eine Liste der Benutzer aus der DB zu holen und ein paar Eigenschaften abzurufen. Beachten Sie 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 );
                }
            }
        });
    }
4
Nico

IDs ist das Array von Objekt-IDs:

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

Mongoose mit Rückruf verwenden:

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

Mongoose mit Async-Funktion verwenden:

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

Vergessen Sie nicht, das Modell mit Ihrem tatsächlichen Modell zu ändern.

0
SnnSnn