mongodb/mongoose findMany: busca todos los documentos con ID enumerados en una matriz

Resuelto ezmilhouse asked hace 12 años • 9 respuestas

Tengo una serie 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.

ezmilhouse avatar Nov 29 '11 06:11 ezmilhouse
Aceptado

La findfunción en mongoose es una consulta completa a mongoDB. Esto significa que puede utilizar la práctica $incláusula mongoDB, que funciona 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 contengan decenas de miles de identificadores. (Ver Determinar eficientemente el propietario de un registro )

Recomendaría que cualquiera que trabaje con mongoDBlea la sección Consultas avanzadas de los excelentes documentos oficiales de mongoDB.

Daniel Mendel avatar Nov 29 '2011 00:11 Daniel Mendel

Ids es la matriz de identificadores de objetos:

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

Usando Mongoose con devolución de llamada:

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

Usando Mongoose con función asíncrona:

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

O más conciso:

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

No olvides cambiar el modelo con tu modelo real.

snnsnn avatar Aug 24 '2019 10:08 snnsnn