mongodb - 如何从文档中检索数组中的单个对象
问题描述
我正在努力从文档中的数组中检索单个对象,其中键systemDelete_DT
为空 - 我尝试过的所有内容要么检索整个数组,要么什么都不检索。
在下面的示例中,我只想检索_id
匹配map.groupId
andmap.systemDelete_DT
为空的对象。
我试过使用$elemMatch
和$filter
其他......无济于事。
如何仅检索_id
匹配map.groupId
andmap.systemDelete_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
重建数组$and
是确保两个条件都为真
这是代码
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
}
}
])
工作Mongo游乐场
推荐阅读
- sql - sql查询异常
- python - 填充pyspark数据框空值
- python - 为什么keras模型不能在python的多进程池中运行?
- java - 如何在 REST API Java 中忽略响应中的某些字段
- javascript - Javascript 自定义事件的大小是否有限?
- jquery - 使用 jQuery - ASP.NET Core MVC 通过单击按钮获取表格行的值
- swift - 在 Swift 中访问泛型参数的类型值
- android - 第一个支持多屏显示的 Android 版本是哪个?
- plsql - DBeaver 中变量名的建议
- python - 如何计算用户 ID 在 Dynamodb 中出现的次数