【问题标题】:How to filter a collection in Mongodb如何在MongoDB中过滤一个集合
【发布时间】:2021-01-01 21:54:02
【问题描述】:

假设我在一个集合中有三个文档,如下所示:

[
  {"_id": "101", parts: ["a", "b"]},
  {"_id": "102", parts: ["a", "c"]},
  {"_id": "103", parts: ["a", "z"]},
]

如果我输入["a","b","c"],我必须写什么查询 (即每个文档中parts 字段值中的所有项目都应存在于["a","b","c"] 中)将输出:

[
  {"_id": "101", parts: ["a", "b"]},
  {"_id": "102", parts: ["a", "c"]}
]

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

【问题讨论】:

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


【解决方案1】:

以下解决方案可能不是最好的,但它有效。这个想法是在输入数组之外找到所有在parts 中没有项目的文档。可以通过$not$elemMatch$nin的组合来完成:

db.collection.find({
  parts: {
    $not: {
      "$elemMatch": {
        $nin: ["a", "b", "c"]
      }
    }
  }
})

Mongo Playground

【讨论】:

  • 为什么你认为这不是最好的解决方案?如果集合中有很多文档,这个解决方案好吗? @Cuong Le Ngoc
  • 如果您有时间可以改进我在此页面上发布的答案,非常感谢。
  • 这是因为我不知道所有的 mongodb 运算符,所以我认为它可能有一个不太复杂的解决方案@blueseal
  • 如果你有空闲时间,你愿意回答stackoverflow.com/questions/63916390/…@Cuong Le Ngoc
【解决方案2】:

感谢@prasad_。我试图想出一个与我想要的类似的解决方案。我在这里用过$setDifference

db.collection.aggregate([
  {
    $project: {
      diff: {
        $setDifference: [
          "$parts",
          [
            "a",
            "b",
            "c"
          ]
        ]
      },
      document: "$$ROOT"
    }
  },
  {
    $match: {
      "diff": {
        $eq: []
      }
    }
  },
  {
    $project: {
      "diff": 0
    }
  },
  
])

输出:

[
  {
    "_id": "101",
    "document": {
      "_id": "101",
      "parts": [
        "a",
        "b"
      ]
    }
  },
  {
    "_id": "102",
    "document": {
      "_id": "102",
      "parts": [
        "a",
        "c"
      ]
    }
  }
]

Mongo Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2013-01-06
    相关资源
    最近更新 更多