MongoDB Find Exact Array Match but order doesn'

2019-01-11 14:53发布

问题:

I am querying for finding exact array match and retrieved it successfully but when I try to find out the exact array with values in different order then it get fails.

Example

db.coll.insert({"user":"harsh","hobbies":["1","2","3"]})
db.coll.insert({"user":"kaushik","hobbies":["1","2"]})
db.coll.find({"hobbies":["1","2"]})

2nd Document Retrieved Successfully

db.coll.find({"hobbies":["2","1"]})

Showing Nothing

Please help

回答1:

The currently accepted answer does NOT ensure an exact match on your array, just that the size is identical and that the array shares at least one item with the query array.

For example, the query

db.coll.find({ "hobbies": { "$size" : 2, "$in": [ "2", "1", "5", "hamburger" ] }  });

would still return the user kaushik in that case.

What you need to do for an exact match is to combine $size with $all, like so:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] }  });

But be aware that this can be a very expensive operation, depending on your amount and structure of data. Since MongoDB keeps the order of inserted arrays stable, you might fare better with ensuring arrays to be in a sorted order when inserting to the DB, so that you may rely on a static order when querying.



回答2:

To match the array field exactly Mongo provides $eq operator which can be operated over an array also like a value.

db.collection.find({ "hobbies": {$eq: [ "singing", "Music" ] }});

Also $eq checks the order in which you specify the elements.

If you use below query:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "1" ] }  });

Then the exact match will not be returned. Suppose you query:

db.coll.find({ "hobbies": { "$size" : 2, "$all": [ "2", "2" ] }  });

This query will return all documents having an element 2 and has size 2 (e.g. it will also return the document having hobies :[2,1]).



回答3:

This query will find exact array with any order.

let query = {$or: [
{hobbies:{$eq:["1","2"]}},
{hobbies:{$eq:["2","1"]}}
]};

db.coll.find(query)