如何使用 mongoDB 查询从对象数组中查找匹配元素
How to find matching elements from an array of objects using mongoDB query
我想找到所有匹配产品“bat”的元素。我的数据库结构如下
[
{
"key": 1,
"productArray" : [
{
"requirementId": 5,
"product": "bat"
},
{
"requirementId": 6,
"product": "Pen"
},
]
},
{
"key": 2
},
{
"key": 3,
"productArray": [
{
"requirementId": 1,
"product": "bat"
},
{
"requirementId": 2,
"product": "Pen"
},
{
"requirementId": 3,
"product": "bat"
},
{
"requirementId": 4,
"product": "bat"
}
]
}
]
我尝试了以下查询,但此查询仅返回一个匹配元素。
db.collection.find({"key": 3}, {"productArray": {"$elemMatch": { "product": "bat"}}})
以上查询结果如下
[
{
"_id": ObjectId("5a934e000102030405000002"),
"productArray": [
{
"product": "bat",
"requirementId": 1
}
]
}
]
我可以使用 mongodb 查询获得我的问题的预期输出吗?或者我应该使用另一种方法来解决我的问题:
我的预期输出如下
[
{
"productArray": [
{
"requirementId": 1,
"product": "bat"
},
{
"requirementId": 3,
"product": "bat"
},
{
"requirementId": 4,
"product": "bat"
}
]
}
]
如您所见,$elemMatch
和 $
都是 惰性运算符 并且 return 是匹配的第一个元素。
您可以在查找中添加管道 (mongoDB 4.4+),但更好地支持聚合:
db.collection.aggregate({
$match: {
key: 3
}
},
{
$project: {
productArray: {
"$filter": {
"input": "$productArray",
"as": "p",
"cond": {
$eq: [
"$$p.product",
"bat"
]
}
}
}
}
})
我想找到所有匹配产品“bat”的元素。我的数据库结构如下
[
{
"key": 1,
"productArray" : [
{
"requirementId": 5,
"product": "bat"
},
{
"requirementId": 6,
"product": "Pen"
},
]
},
{
"key": 2
},
{
"key": 3,
"productArray": [
{
"requirementId": 1,
"product": "bat"
},
{
"requirementId": 2,
"product": "Pen"
},
{
"requirementId": 3,
"product": "bat"
},
{
"requirementId": 4,
"product": "bat"
}
]
}
]
我尝试了以下查询,但此查询仅返回一个匹配元素。
db.collection.find({"key": 3}, {"productArray": {"$elemMatch": { "product": "bat"}}})
以上查询结果如下
[
{
"_id": ObjectId("5a934e000102030405000002"),
"productArray": [
{
"product": "bat",
"requirementId": 1
}
]
}
]
我可以使用 mongodb 查询获得我的问题的预期输出吗?或者我应该使用另一种方法来解决我的问题:
我的预期输出如下
[
{
"productArray": [
{
"requirementId": 1,
"product": "bat"
},
{
"requirementId": 3,
"product": "bat"
},
{
"requirementId": 4,
"product": "bat"
}
]
}
]
如您所见,$elemMatch
和 $
都是 惰性运算符 并且 return 是匹配的第一个元素。
您可以在查找中添加管道 (mongoDB 4.4+),但更好地支持聚合:
db.collection.aggregate({
$match: {
key: 3
}
},
{
$project: {
productArray: {
"$filter": {
"input": "$productArray",
"as": "p",
"cond": {
$eq: [
"$$p.product",
"bat"
]
}
}
}
}
})