【问题标题】:How to filter a collection based on each array item in a doc field in Mongodb如何根据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_

标签: arrays mongodb mongoose mongodb-query aggregation-framework


【解决方案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)...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 2011-12-04
      相关资源
      最近更新 更多