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"
}}
])
它将在同一个集合中进行简单的连接。
我达到了某个点,这可能是处理此问题的最佳方式
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。
我有一个这样的合集
{
"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"
}}
])
它将在同一个集合中进行简单的连接。
我达到了某个点,这可能是处理此问题的最佳方式
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。