Pregunta

Tengo una variedad de _ids y quiero obtener todos los documentos en consecuencia, ¿cuál es la mejor manera de hacerlo?

Algo como ...

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

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

La matriz puede contener cientos de _IDs.

¿Fue útil?

Solución

los find La función en Mongoose es una consulta completa para MongoDB. Esto significa que puedes usar el práctico MongoDB $in Cláusula, que funciona al igual que la versión SQL de la misma.

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

Este método funcionará bien incluso para matrices que contienen decenas de miles de ID. (Ver Determinar eficientemente el propietario de un registro)

Recomendaría que cualquiera que trabaje con mongoDB leer el Consultas avanzadas Sección de lo excelente Documentos oficiales de MongoDB

Otros consejos

Use este formato de consulta

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

Tanto Node.js como Mongochef me obligan a convertir a ObjectId. Esto es lo que utilizo para obtener una lista de usuarios del DB y obtener algunas propiedades. Cuida la conversión de tipo en la línea 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 es la matriz de ID de objeto:

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

Usando Mongoose con devolución de llamada:

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

Uso de Mongoose con la función Async:

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

No olvide cambiar el modelo con su modelo real.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top