如何根据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:如何根据每个字段的值更新多个文档中的字段值?