Pierre Le Roux
Pierre Le Roux

Reputation: 494

Mongodb : How to find documents in which fields match an ObjectId or a string?

I have some documents in a collection in Mongodb :

{_id : ObjectId('533af69b923967ac1801e113'), fKey : '533aeb09ebef89282c6cc478', ... }
{_id : ObjectId('5343bd1e2305566008434afc'), fKey : ObjectId('5343bd1e2305566008434afc'), ...} }

As you can see my field fkey can be set by a string or an ObjectId.

I would like to get all documents which match '533aeb09ebef89282c6cc478' or ObjectId('5343bd1e2305566008434afc').

But if i run :

db.mycollection.find({fkey : '533aeb09ebef89282c6cc478'})

I only get the first document of the collection.

Is there a way to configure Mongodb in order to get all documents which match the request without checking the type ?

Thanks for your help.

Pierre

Upvotes: 2

Views: 2534

Answers (1)

Lix
Lix

Reputation: 47956

There are two options for you here.

You could use mongo's $or operator:

db.mycollection.find({ 
  $or: [ 
    { fKey: '533aeb09ebef89282c6cc478' }, 
    { fKey: ObjectId( '533aeb09ebef89282c6cc478' ) } 
  ] 
})

The $or operator performs a logical OR operation on an array of two or more <expressions> and selects the documents that satisfy at least one of the <expressions>.


You could also use the $in operator:

db.mycollection.find({ 
  fKey: { 
    "$in": [ '533aeb09ebef89282c6cc478', ObjectId( '533aeb09ebef89282c6cc478' )  ] 
  }
})

The $in operator selects the documents where the value of a field equals any value in the specified array.


It sounds to me like these inconsistencies are not meant to be there. I recommend going through your code and data pipelines and figure out who/what is inserting the fKey value with an unknown datatype.

Upvotes: 6

Related Questions