MongoDB:按共享相同值的多个方面过滤文档

MongoDB: Filter documents by multiple aspects sharing same value

我有一个这样的合集

{
    "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",
  },
]

这应该returnproductId = someId-1

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

你应该使用$lookup

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

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

Refer

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

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。