如何根据MongoDB中文档字段中的每个数组项过滤集合

Posted

技术标签:

【中文标题】如何根据MongoDB中文档字段中的每个数组项过滤集合【英文标题】:How to filter a collection based on each array item in a doc field in Mongodb 【发布时间】:2021-01-03 01:39:57 【问题描述】:

假设我有一个收藏,如下所示:

[
 "_id": "101",  parts: [1.2, 2] ,
 "_id": "102",  parts: [2, 3.5] ,
 "_id": "103",  parts: [4.1, 10] 
]

我需要编写什么查询以使数组parts 中的每个项目都大于等于输入数组[1, 5] 中具有相同数组索引的项目?

输出将是:

[
 "_id": "103",  parts: [4.1, 10]  // 4.1 >= 1 and 10 >= 5
]

这可能吗?有什么想法吗?

【问题讨论】:

parts 数组和 input 数组的元素个数相同吗? 是的,相同数量的元素@prasad_ 【参考方案1】:

您可以使用点符号并为您的示例运行以下查询:

"parts.0":"$gte":1,"parts.1":"$gte":5

Mongo Playground

或者使用下面的 JS 代码来构建更通用的东西:

let input = [1,5];
let query = Object.fromEntries(input.map((val, i) => ([ "parts." + i,  $gte: val  ])));

console.log(query);

【讨论】:

【参考方案2】:

如果您在查询之前知道输入数组,那么您可以先从中创建查询对象,然后将此对象传递给查询:

let query = input.reduce((acc, cur, index) => 
  acc['parts.' + index] =  $gt: cur ;
  return acc;
, );
// [1, 5] will create "parts.0": $gt: 1,"parts.1": $gt: 5
db.collection.find(query)...

【讨论】:

以上是关于如何根据MongoDB中文档字段中的每个数组项过滤集合的主要内容,如果未能解决你的问题,请参考以下文章

MongoDb:如何根据每个字段的值更新多个文档中的字段值?

MongoDb:如何根据每个字段的值更新多个文档中的字段值?

带有 C#Driver 的 MongoDB:如何过滤嵌套对象数组中的字段

如何匹配MongoDB中的子文档数组?

MongoDB请求:仅从嵌入数组中的嵌入文档中过滤特定字段

如何根据另一个字段更新 mongodb 中的数组 dict 元素