简体   繁体   English

MongoDB对象数组中的搜索字符串

[英]MongoDB search string in array of objects

I have a structure in MongoDB that have different amounts of items in an array called "items". 我在MongoDB中有一个结构,该结构在称为“项目”的数组中具有不同数量的项目。 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: 为了进行搜索,我使用以下命令,该命令首先将内容转换为字符串,例如this.items根据对象存在不同的结构:

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. 我的问题是,由于我不知道每个文档的项目数量,因此我必须使用通配符作为this.items [*]。value,但它不起作用。

Does anyone know any solution, or have another idea for this? 有谁知道任何解决方案,或对此有其他想法?

您可以使用items.value点符号来定位所有items元素的value字段,并使用正则表达式执行不区分大小写的子字符串匹配:

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

You can use the $elemMatch ( https://docs.mongodb.com/manual/reference/operator/projection/elemMatch/ ) 您可以使用$ 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. 因此,此查询将在items数组中找到所有带有item文档,这些文档的value属性中包含字符串“ text”,执行此操作后,您可以计算该文档有多少项目。

You can iterate each document and apply the indexOf , something like this.. 您可以迭代每个文档并应用indexOf ,类似这样。

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM