Sergio
Sergio

Reputation: 619

MongoDB search string in array of objects

I have a structure in MongoDB that have different amounts of items in an array called "items". To make the search, I am using the following command, which first turns the contents into a string, as in this.items there is a different structure depending on the object:

db.getCollection('docs').find.('JSON.stringify(this.items[0].value).toLowerCase().indexOf("text")!=-1')

My problem is that as I do not know the amount of items that each document has, I would have to use a wildcard as this.items[*].value, but it does not work.

Does anyone know any solution, or have another idea for this?

Upvotes: 1

Views: 7107

Answers (3)

Sander Visser
Sander Visser

Reputation: 4320

You can use the $elemMatch (https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/)

db.docs.find({items: {$elemMatch: {value: {$regex : "text"}}}});

So this query will find all documents with an item in the items array that contain the string "text" in the value property, after this operation you can count how much items the document has.

Upvotes: 5

JohnnyHK
JohnnyHK

Reputation: 311935

You can use dot notation of items.value to target the value field of all items elements, and a regular expression to perform the case-insensitive sub-string match:

db.getCollection('docs').find({ 'items.value': /text/i })

Upvotes: 3

BrTkCa
BrTkCa

Reputation: 4783

You can iterate each document and apply the indexOf, something like this..

var cursor = db.getCollection('docs').find({}); // get all docs
var newOut = []; // new array of items if match with some condition
while ( cursor.hasNext() ){ // iterate all docs

   var doc = cursor.next(); // get the document in focus
   doc.items.forEach(function(item){ // iterate the items of doc.items
       if ( item.toLowerCase().indexOf("text") !== -1 ) // check if text exists in array
           newOut.push(item); // add to new array
   });

};
printjson(newOut);

Upvotes: -1

Related Questions