mongodb / mongoose findMany - dizide listelenen kimlikleri olan tüm belgeleri bul


246

_İds bir dizi var ve buna göre tüm belgeleri almak istiyorum, bunu yapmanın en iyi yolu nedir?

Gibi bir şey ...

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

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

Dizi yüzlerce _id içerebilir.

Yanıtlar:


479

findMongoose içindeki fonksiyon mongoDB için tam bir sorgudur. Bu $in, aynı SQL sürümü gibi çalışan kullanışlı mongoDB yan tümcesini kullanabileceğiniz anlamına gelir .

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

Bu yöntem on binlerce kimlik içeren diziler için bile iyi çalışır. (Bkz . Bir kaydın sahibini etkili bir şekilde belirleme )

Birlikte çalışan herkesin mükemmel Resmi mongoDB Dokümanlarının Gelişmiş Sorgular bölümünü mongoDBokumasını tavsiye ederim


9
Bu tartışmaya biraz geç kaldınız, ancak iade edilen öğelerin sırasının, dizide sağladığınız öğelerin dizisinin sırasıyla eşleştiğinden nasıl emin olabilirsiniz? Bir tür belirtmediğiniz sürece belgelerin herhangi bir sırada çıkacağı garanti edilmez. Ya onları dizide listelediğiniz sırayla sıralamak isterseniz (örneğin ... 000c, ... 000d, ... 000e)?
Kevin

7
Bu bir sebepten ötürü işe yaramadı. Boş bir doküman
dizim

2
@chovy , dizeleri geçmek yerine önce bunları ObjectIds'a dönüştürmeyi deneyin .
Georgi Hristozov

@GeorgiHristozov Özel bir kimlik üreteci kullanıyorum ... ObjectId dönüştürmek hala çalışıyor mu? (Firavun faresi + kısa devre)
chovy

1
@Schybo kesinlikle fark etmez. { _id : 5 }ile aynıdır { '_id' : 5 }.
royhowie

27

ID'ler nesne kimlikleri dizisidir:

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

Mongoose'u geri arama ile kullanma:

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

Mongoose'u zaman uyumsuz işleviyle kullanma:

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

Modeli gerçek modelinizle değiştirmeyi unutmayın.


Bu, en güncel ve tutarlı cevap olduğu için kabul edilen cevap olmalıdır. İzinli cevap olarak objectId için kimlikleri dönüştürmek gerekmez, ve kullandığı firavunfaresi zorunlu tarzı sorguları. Teşekkürler btw!
Javi Marzán

Bu çok temiz ve güncellenmiş bir yöntemdir, eğer birkaç soru sormak sakıncası yoksa ObjectId, yukarıdaki gibi referanslar dizisi varsa (örneğin, projelerim var ve bir dizi atadım) kullanıcı modelinde başvurulan project_id ile belirli kullanıcılara projeler), bir projeyi silersem id, kullanıcı modelinden başvurulan diziden silindiğinden nasıl emin olabilirim ? Teşekkürler mat.
Eazy

9

Bu sorgulama biçimini kullanın

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();

4

Hem node.js hem de MongoChef beni ObjectId'e dönüştürmeye zorluyor. Ben DB kullanıcıların listesini almak ve birkaç özellik almak için kullandığım budur. 8. satırdaki tür dönüşümüne dikkat edin.

// 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 );
                }
            }
        });
    }

7
userIds = _.map (liste, işlev (userId) {return mongoose.Types.ObjectId (userId)};
Michael Draper

1
Mongoose 4.5.9 kullanarak ObjectID dönüştürmek zorunda değildi.
Florian Wendelborn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.