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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top