Organizational Research By

Surprising Reserch Topic

mongodb or query


mongodb or query  using -'mongodb,mongodb-shell'

I run following query in mongo shell:

db.Profiles.find ( { $or : [ { "name" : "gary" }, {"name":"rob} ] } )


It just returns nothing as expected(JSON)?
    

asked Sep 29, 2015 by thiru
0 votes
2 views



Related Hot Questions

2 Answers

0 votes

Use $in

For the query in the question, it's more appropriate to use $in

db.Profiles.find ( { "name" : { $in: ["gary", "rob"] } } );

Why doesn't it work

There's a missing quote - the cli is waiting for you to finish the second part of your or:

db.Profiles.find ( { $or : [ { "name" : "gary" }, {"name":"rob} ] } )
..............................................................^

You need to finish the query sufficiently for the cli to parse it for it to then say there's a syntax error.

Case insensitive matching

As indicated by a comment, if you want to search in a case insensitive manner, then you either use $or with a $regex:

db.Profiles.find ( { $or : [ { "name" : /^gary/i }, {"name": /^rob/i } ] } )

Or, you simply use one regex:

db.Profiles.find ( { "name" : /^(gary|rob)/i } )

However, a regex query that doesn't start with a fixed string cannot use an index (it cannot use an index and effectively do "start here until no match found then bail") and therefore is sub-optimal. If this is your requirement, it's a better idea to store a normalized name field (e.g. name_lc - lower case name) and query on that:

db.Profiles.find ( { "name_lc" : { $in: ["gary", "rob"] } } );
answered Sep 29, 2015 by okesh.badhiye
0 votes

Sometimes $or doesn't work and you should write "$or" instead of it , and a " after rob, and it would be like this:

db.Profiles.find ( { "$or" : [ { "name" : "gary" }, {"name":"rob"} ] } )
answered Sep 29, 2015 by sumit_jaiswalmca

...