Mongodb 如何从文档检索数组中的单个对象
我正在努力从文档中的数组中检索单个对象,其中键Mongodb 如何从文档检索数组中的单个对象,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我正在努力从文档中的数组中检索单个对象,其中键systemDelete\u DT为空-我尝试的所有操作要么检索整个数组,要么什么也不检索 在下面的示例中,我只想检索\u id与map.groupId匹配且map.systemDelete\u DT为空的对象 我尝试过使用$elemMatch和$filter等工具。。。。无济于事 如何仅检索\u id与map.groupId匹配且map.systemDelete\u DT为空的对象 我的查询 db.collection.aggregate([
systemDelete\u DT
为空-我尝试的所有操作要么检索整个数组,要么什么也不检索
在下面的示例中,我只想检索\u id
与map.groupId
匹配且map.systemDelete\u DT
为空的对象
我尝试过使用$elemMatch
和$filter
等工具。。。。无济于事
如何仅检索\u id
与map.groupId
匹配且map.systemDelete\u DT
为空的对象
我的查询
db.collection.aggregate([
{
$lookup: {
from: "products",
let: {
id: "$_id"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$$id",
"$map.groupId"
]
},
},
},
{
$project: {
_id: 1,
"map.groupId": 1,
},
},
],
as: "p_map",
},
},
{
$project: {
p_map: 1
}
}
])
预期结果
{
"_id": ObjectId("609bc0c7c2a4e3164662238a"),
"systemDelete_DT": null,
"groupId": ObjectId("6099619baa04f15c3fb67a83")
}
示例集合
db={
"collection": [
{
"_id": ObjectId("6099619baa04f15c3fb67a83")
}
],
"products": [
{
"_id": ObjectId("608d92fdc90b0ea83a8b52bb"),
"map": [
{
"_id": ObjectId("609bc0c7c2a4e3164662238a"),
"systemDelete_DT": null,
"groupId": ObjectId("6099619baa04f15c3fb67a83")
},
{
"_id": ObjectId("609bc0c7c2a4e3164662238a"),
"systemDelete_DT": "2021-05-14T15:01:20+01:00",
"groupId": ObjectId("6099619baa04f15c3fb67a83")
},
{
"_id": ObjectId("609bd0bbaffb7018a41c2f1e"),
"systemDelete_DT": "2021-05-12T13:57:34+01:00",
"groupId": ObjectId("609964e44cc4275e520d3df0")
},
{
"_id": ObjectId("609c019bad4cd31e7bc569bf"),
"systemDelete_DT": "2021-05-12T17:26:43+01:00",
"shopifyId": "6670290944179",
"groupId": ObjectId("6099a006a8480e782ddc1d87")
},
],
}
]
}
您可以使用
解构阵列$unwind
重建阵列$group
用于确保这两个条件均为真$和
db.collection.aggregate([
{
$lookup: {
from: "products",
let: { id: "$_id" },
pipeline: [
{ $unwind: "$map" },
{
$match: {
$expr: {
$and: [
{ $eq: [ "$$id", "$map.groupId" ] },
{ $eq: [ "$map.systemDelete_DT", null ] }
]
}
}
},
{
$group: {
_id: "$_id",
map: { $push: "$map" }
}
}
],
as: "p_map",
}
},
{
$project: {
p_map: 1
}
}
])
工作您可以使用
解构阵列$unwind
重建阵列$group
用于确保这两个条件均为真$和
db.collection.aggregate([
{
$lookup: {
from: "products",
let: { id: "$_id" },
pipeline: [
{ $unwind: "$map" },
{
$match: {
$expr: {
$and: [
{ $eq: [ "$$id", "$map.groupId" ] },
{ $eq: [ "$map.systemDelete_DT", null ] }
]
}
}
},
{
$group: {
_id: "$_id",
map: { $push: "$map" }
}
}
],
as: "p_map",
}
},
{
$project: {
p_map: 1
}
}
])
工作$match
null条件systemDelete\u DT
迭代映射循环并按这两个条件进行过滤$filter
从地图中选择第一个对象$arrayElemAt
使用$replaceRoot
$arrayElemAt
$match
null条件systemDelete\u DT
迭代映射循环并按这两个条件进行过滤$filter
从地图中选择第一个对象$arrayElemAt
使用$replaceRoot
$arrayElemAt
嗨,我不确定我做了什么不同的事情……这救了我!非常感谢。哈哈,希望两者都是对的。。有时最终数组可能/可能不包含我没有使用的对象
$arrayElemAt
。所以他最好使用$ifNull
嗨,我不确定我做了什么不同的事情……这救了我!非常感谢。哈哈,希望两者都是对的。。有时最终数组可能/可能不包含我没有使用的对象$arrayElemAt
。所以他最好使用$ifNull