【发布时间】:2020-07-24 05:21:42
【问题描述】:
考虑到我在一个集合中有以下文档(忽略_id):
[
{
"Id": "OP01",
"Sessions": [
{
"Id": "Session01",
"Conversations": [
{
"Id": "Conversation01",
"Messages": [
{
"Id": "Message01",
"Status": "read",
"Direction": "inbound"
},
{
"Id": "Message02",
"Status": "delivered",
"Direction": "internal"
},
{
"Id": "Message03",
"Status": "delivered",
"Direction": "inbound"
},
{
"Id": "Message04",
"Status": "sent",
"Direction": "outbound"
}
]
},
{
"Id": "Conversation02",
"Messages": [
{
"Id": "Message05",
"Status": "sent",
"Direction": "outbound"
}
]
}
]
},
{
"Id": "Session02",
"Conversations": [
{
"Id": "Conversation03",
"Messages": [
{
"Id": "Message06",
"Status": "read",
"Direction": "inbound"
},
{
"Id": "Message07",
"Status": "delivered",
"Direction": "internal"
}
]
},
{
"Id": "Conversation04",
"Messages": []
}
]
}
]
},
{
"Id": "OP02",
"Sessions": [
{
"Id": "Session03",
"Conversations": []
}
]
},
{
"Id": "OP03",
"Sessions": []
}
]
第一个查询 - 聚合 (+$project)
我想获取按他们的 Conversations 分组的 Messages 列表,其中:
Sessions.Id: "Session01"
和
Sessions.Conversations.Messages.Direction $in ["inbound", "outbound"]
和
Sessions.Conversations.Messages.Status $in ["sent", "delivered"]
预期结果是:
[
{
"Id": "Conversation01",
"Messages": [
{
"Id": "Message03",
"Status": "delivered",
"Direction": "inbound"
},
{
"Id": "Message04",
"Status": "sent",
"Direction": "outbound"
}
]
},
{
"Id": "Conversation02",
"Messages": [
{
"Id": "Message05",
"Status": "sent",
"Direction": "outbound"
}
]
}
]
附注:
如果在不同的documents(或不同的Sessions)上验证Sessions.Id: "Session01"条件("Session01"不是唯一键),document' s Messages 符合其他条件的也应该添加。
结果输出未提及document 或Sessions 级别。
第二个查询——更新
我想将所有这些消息中的Sessions.Conversations.Messages.Status(与以前相同)更新为"read"。
该集合现在应该具有以下文档:
请注意以下更改:
Sessions.Conversations.Messages.Id = "Message03"Sessions.Conversations.Messages.Id = "Message04"Sessions.Conversations.Messages.Id = "Message05"
在Sessions.Id = "Session01"
[
{
"Id": "OP01",
"Sessions": [
{
"Id": "Session01",
"Conversations": [
{
"Id": "Conversation01",
"Messages": [
{
"Id": "Message01",
"Status": "read",
"Direction": "inbound"
},
{
"Id": "Message02",
"Status": "delivered",
"Direction": "internal"
},
{
"Id": "Message03",
"Status": "read",
"Direction": "inbound"
},
{
"Id": "Message04",
"Status": "read",
"Direction": "outbound"
}
]
},
{
"Id": "Conversation02",
"Messages": [
{
"Id": "Message05",
"Status": "read",
"Direction": "outbound"
}
]
}
]
},
{
"Id": "Session02",
"Conversations": [
{
"Id": "Conversation03",
"Messages": [
{
"Id": "Message06",
"Status": "read",
"Direction": "inbound"
},
{
"Id": "Message07",
"Status": "delivered",
"Direction": "internal"
}
]
},
{
"Id": "Conversation04",
"Messages": []
}
]
}
]
},
{
"Id": "OP02",
"Sessions": [
{
"Id": "Session03",
"Conversations": []
}
]
},
{
"Id": "OP03",
"Sessions": []
}
]
如何使用 aggregate 和 update_one 查询来完成这些结果?
以下是两个查询的直观解释:
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework aggregate pymongo