比较对象数组的查询

我想知道如何在Mongoose中比较(嵌套)对象的数组。

考虑到下面的数据,我想获得name属性匹配的结果。 任何人都可以帮助我吗?

  Organisation.find( { $or: [ { "category_list": { $in: cat_list } }, { "place_topics.data": { $in: place_tops } } ] } ) 

假设这是存储在我的MongoDB中的数据:

  "category_list": [ { "id": "197750126917541", "name": "Pool & Billiard Hall" }, { "id": "197871390225897", "name": "Cafe" }, { "id": "218693881483234", "name": "Pub" } ], "place_topics": { "data": [ { "name": "Pool & Billiard Hall", "id": "197750126917541" }, { "name": "Pub", "id": "218693881483234" } ] } 

假设这些是我想比较的数组(几乎相同的数据):

 let cat_list = [ { "id": "197750126917541", "name": "Pool & Billiard Hall" }, { "id": "197871390225897", "name": "Cafe" }, { "id": "218693881483234", "name": "Pub" } ] let place_tops = [ { "name": "Pool & Billiard Hall", "id": "197750126917541" }, { "name": "Pub", "id": "218693881483234" } ] 

当每个数组元素需要“多个条件”时,实际上使用$elemMatch ,而实际上“需要”,否则你不匹配正确的元素。

因此,要应用多个条件,您宁愿为$or而不是快捷方式的条件数组:

 Organizations.find({ "$or": [].concat( cat_list.map( c => ({ "category_list": { "$elemMatch": c } }) ), place_tops.map( p => ({ "place_topics": { "$elemMatch": p } }) ) ) }) 

然而 ,如果你退一步,逻辑思考,你实际上命名了一个属性“id” 。 这通常意味着在所有的良好实践中,价值实际上是“独特的”。

因此,您真正需要做的就是简单地提取这些值并坚持原始的查询forms:

 Organizations.find({ "$or": [ { "category_list.id": { "$in": cat_list.map(c => c.id) } }, { "place_topics.id": { "$in": place_tops.map(p => p.id) } } ] }) 

因此,简单地将值和属性映射到“匹配”到"id"值。 这是一个简单的“点符号”forms,当每个数组元素有一个条件用于testing/匹配时,这通常就足够了。

对于数据来说,这通常是最合乎逻辑的方法,您应该应用其中哪一种实际适合您所需的数据条件。 对于“多个”使用$elemMatch 。 但是,如果你不需要多个,因为有一个单一的匹配,那么简单地做单数匹配