110

is possible in mongo db to select collection's documents like in SQL :

SELECT * FROM collection WHERE _id IN (1,2,3,4);

or if i have a _id array i must select one by one and then recompose the array/object of results?

KARTHIKEYAN.A
  • 14,686
  • 4
  • 102
  • 112
itsme
  • 47,321
  • 93
  • 214
  • 341

5 Answers5

213

Easy :)

db.collection.find( { _id : { $in : [1,2,3,4] } } );

taken from: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24in

programmersbook
  • 3,674
  • 1
  • 19
  • 13
10

Because mongodb uses bson and for bson is important attribute types. and because _id is ObjectId you must use like this:

db.collection.find( { _id : { $in : [ObjectId('1'),ObjectId('2')] } } );

and in mongodb compass use like this:

{ "_id" : { $in : [ObjectId('1'),ObjectId('2')] } }

Note: objectId in string has 24 length.

ttrasn
  • 3,457
  • 4
  • 26
  • 38
5

list is a array of ids

In this code list is the array of ids in user collection

var list = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"]

    .find({ _id: {$in : list}})
KARTHIKEYAN.A
  • 14,686
  • 4
  • 102
  • 112
  • 4
    The code is not working. It seems have to set IDs as ObjectId("5883d387971bb840b7399130") – Pax Beach May 15 '18 at 09:13
  • How do we do set them to ObjectIds programmatically? I tried the approach suggested by @klipmode in one of the answers, but that does not work. – Vikalp Jain May 06 '21 at 04:36
4

You can try this

var ids = ["5883d387971bb840b7399130","5883d389971bb840b7399131","5883d38a971bb840b7399132"];

var oids = [];
ids.forEach(function(item){
oids.push(new ObjectId(item));
});

.find({ _id: {$in : oids}})
klipmode
  • 41
  • 1
0

if you want to find by user and also by another field like conditionally, you can easily do it like beneath with spread and ternary operator using aggregate and match

 const p_id = patient_id;
    let fetchingReports = await Reports.aggregate([
      ...(p_id
        ? [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
                patient_id: p_id,
              },
            },
          ]
        : [
            {
              $match: {
                createdBy: mongoose.Types.ObjectId(id),
              },
            },
        
Ericgit
  • 4,451
  • 2
  • 34
  • 44