Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Search full document in mongodb for a match

Is there a way to match a value with every array and sub document inside the document in mongodb collection and return the document

{
  "_id" : "2000001956",
  "trimline1" : "abc",
  "trimline2" : "xyz",
  "subtitle"  : "www",
  "image" : {
    "large" : 0,
    "small" : 0,
    "tiled" : 0,
    "cropped" : false
  },     
  "Kytrr" : {
      "count" : 0,
      "assigned" : 0
  }

}

for eg if in the above document I am searching for xyz or "ab" or "xy" or "z" or "0" this document should be returned.

I actually have to achieve this at the back end using C# driver but a mongo query would also help greatly.

Please advice.

Thanks

like image 739
Arshya Avatar asked Oct 21 '14 08:10

Arshya


People also ask

How do I use full-text search in MongoDB?

Implement full-text search in MongoDB AtlasGo to any cluster and select the “Search” tab to do so. From there, you can click on “Create Search Index” to launch the process. Once the index is created, you can use the $search operator to perform full-text searches.

How do I search for a document in MongoDB?

To find documents that match a set of selection criteria, call find() with the <criteria> parameter. MongoDB provides various query operators to specify the criteria. For a list of the query operators, see Query Selectors.

Does MongoDB have full-text search?

MongoDB offers a full-text search solution, MongoDB Atlas Search, for data hosted on MongoDB Atlas.

How do I fetch all documents in MongoDB?

Connect to a database using the getDatabase() method. Get the object of the collection from which you want to retrieve the documents, using the getCollection() method. Retrieve the iterable object containing all the documents of the current collection by invoking the find() method.


2 Answers

You could probably do this using '$where'

db.mycollection({$where:"JSON.stringify(this).indexOf('xyz')!=-1"})

I'm converting the whole record to a big string and then searching to see if your element is in the resulting string. Probably won't work if your xyz is in the fieldnames!

You can make it iterate through the fields to make a big string and then search it though.

This isn't the most elegant way and will involve a full tablescan. It will be faster if you look through the individual fields!

like image 169
Malcolm Murdoch Avatar answered Oct 21 '22 09:10

Malcolm Murdoch


While Malcolm's answer above would work, when your collection gets large or you have high traffic, you'll see this fall over pretty quickly. This is because of 2 things. First, dropping down to javascript is a big deal and second, this will always be a full table scan because $where can't use an index.

MongoDB 2.6 introduced text indexing which is on by default (it was in beta in 2.4). With it, you can have a full text index on all the fields in the document. The documentation gives the following example where a text index is created for every field and names the index "TextIndex".

db.collection.ensureIndex(
    { "$**": "text" },
    { name: "TextIndex" }
)
like image 38
Craig Wilson Avatar answered Oct 21 '22 10:10

Craig Wilson