我有一个查询,需要在其中按ID查找文档,然后只需要返回数组中符合特定条件的项目。
在下面的代码中,您将看到我只需要按ID“匹配”一个文档,然后我将一个“限制”设为一个(应该只有一个)。这是我真的很困惑的地方...我然后“展开”数组的 fragments 字段,数组内部是子文档。我需要通过其中的数组的最后一项过滤掉这些子文档,因此我“投影”了 assignments_array 的“切片”。这是我只需要B
为空或assignments_array
为空的文档
assignment_history.to
这给我这个结果...
db.getCollection('territories').aggregate([
{
"$match": {
"congregation": ObjectId("5c68c706f1f52047f08862b3")
}
},
{
"$limit": 1
},
{
$unwind: {
path: "$fragments"
}
},
{
$project: {
"fragments.number": 1,
"fragments.assignment_history": {"$slice": ["$fragments.assignment_history", -1]}
}
}
我需要结束于2个对象,其中{
"_id": ObjectId("5c68c706f1f52047f08862b6"),
"fragments": {
"number": 1,
"assignment_history": [{
"to": ObjectId("5c68c706f1f52047f08862b4"),
"on": 1550370567067
}]
}
}
{
"_id": ObjectId("5c68c706f1f52047f08862b6"),
"fragments": {
"number": 2,
"assignment_history": []
}
}
{
"_id": ObjectId("5c68c706f1f52047f08862b6"),
"fragments": {
"number": 3,
"assignment_history": [{
"to": null,
"on": 1550370567067
}]
}
}
为空,而assignment_history.to
没有项目/长度。
答案 0 :(得分:1)
您可以在$match
之后再使用一种$unwind
条件
db.getCollection('territories').aggregate([
{ "$match": { "congregation": ObjectId("5c68c706f1f52047f08862b3") }},
{ "$limit": 1 },
{ "$unwind": { "path": "$fragments" }},
{ "$match": {
"$or": [
{ "fragments.assignment_history.to": null },
{ "fragments.assignment_history.to": { "$exists": false }}
]
}},
{ "$project": {
"fragments.number": 1,
"fragments.assignment_history": { "$slice": ["$fragments.assignment_history", -1] }
}}
])
答案 1 :(得分:0)
尝试在项目之前添加此阶段。
它的意思是给我那些fragments.assignment_history
为空的人,
或没有fragments.assignment_history.to
{
$match: {
$or : [
{ "fragments.assignment_history" : {$size: 0}},
{
"fragments.assignment_history" :{
$not: { $elemMatch: { to : {$exists: true} }
}
}
]
}
}