【问题标题】:MongoDB: Filter documents by multiple aspects sharing same valueMongoDB:通过共享相同值的多个方面过滤文档
【发布时间】:2022-01-26 23:40:30
【问题描述】:

我有这样的收藏

{
    "productId" : ObjectId("someId-1"),
    "value" : "Nike",
    "key" : "Brand",
},

{
    "productId" : ObjectId("someId-1"),
    "value" : "Blue",
    "key" : "Color",
},

{
    "productId" : ObjectId("someId-2"),
    "value" : "Nike",
    "key" : "Brand",
},

{
    "productId" : ObjectId("someId-2"),
    "value" : "Red",
    "key" : "Color",
},

我想进行查询以获取共享这些方面的所有产品 ID

[
  {
    key: "Brand",
    value: "Nike",
  },
  {
    key: "Color",
    value: "Blue",
  },
]

这应该返回productId = someId-1

请注意,我想使用在所有三个字段(productId、key、value)上创建的索引

【问题讨论】:

  • 那么,您尝试过什么?您是否尝试过使用 $ 或指定条件?
  • 是的,我尝试将 $or 与 productId 上的 $group 一起作为键,但这利用了键和值部分的索引而不是 productId 部分

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

你应该使用$lookup

db.collection.aggregate([
  { "$match": { "key": 'Brand', 'value':'Nike' }},
  { "$lookup": {
    "from": "collection",
    "localField": "productId",
    "foreignField": "productId",
    "as": "ids"
  }}
])

它将在同一个集合中进行简单的连接。

Refer

【讨论】:

  • 查找部分不是我在这里面临的问题。我想用某些方面的组合形式(键、值)来搜索集合。但共享相同的productId
  • 你能解释一下吗?
  • 我有一个包含键 [key, value, productId] 的集合。我想做一个接受这样的数组的查询 [ { key: "Brand", value: "Nike", }, { key: "Color", value: "Blue", }, ] 应用所有数组条件但在同一产品中。所以我们将拥有所有品牌为耐克且颜色为蓝色的产品
  • 这对于跨多个文档共享的值来说确实是不可能的。如果你使用 $or,你最终会得到不需要的项目。
  • 你需要使用查找或两个查询
【解决方案2】:

我达到了可能是处理此问题的最佳方法的某个点

db.collection.aggregate([
    {
        $match: {
            $or: [
                { key: 'Model', value: 'GV Special' },
                {
                    key: 'Brand',
                    value: 'Puma'
                },
                {
                    key: 'Color',
                    value: 'Multicolor'
                }]
        }
    },
    {
        $group: {
            _id: "$productId",
            products: { $push: "$productId" }
        }
    },
    {
        $match: {
            products: { $size: 3 }
        }
    }
])

但这最后一个匹配 $size 应该是您想要从 $or 运算符匹配的方面数。

因此,如果我们只想应用来自 $or 的 2 个条件,我们会将 $size 更改为 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-23
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2019-06-19
    • 1970-01-01
    相关资源
    最近更新 更多