MongoDB 聚合过滤器 returns 空
MongoDB aggregate filter returns null
在 MongoDB 中,我有一个消息集(在下面找到):
我有兴趣通过 id 查询父文档,并说过滤 contactedNumberMessages
以仅包含传入消息(方向为“in”的消息)所以我用 Mongoose 编写了以下代码,但是 contactedNumberMessages
在返回的数据中是 null
,关于我为什么得到 null
的任何线索?谢谢
Messages.aggregate([
{
$match: {
_id: id
}
},
{
$project: {
messaging: {
ourNumber: 1,
messages: {
contact: 1,
contactedNumberMessages: {
$filter: {
input: "$contactedNumberMessages",
as: "message",
cond: {
$eq: ["$$message.direction", "out"]
}
}
}
}
}
}
}
]);
{
"_id": {
"$oid": "612f4e32aa56064f1608c2eb"
},
"messaging": [
{
"ourNumber": "+15123568549",
"messages": [
{
"contact": "+21629000111",
"contactedNumberMessages": [
{
"direction": "out",
"content": "Hello!",
"when": {
"$date": "2021-09-23T23:00:00.000Z"
},
"nature": "SMS"
},
{
"direction": "in",
"content": "Hi!",
"when": {
"$date": "2021-09-23T23:00:00.000Z"
},
"nature": "SMS"
}
]
}
]
}
]
}
请参考这里的例子:https://mongoplayground.net/p/9toRoa_5IE9
您应该在聚合中使用如下内容:
[{$match: {
_id: ObjectId('612f4e32aa56064f1608c2eb')
}}, {$unwind: {
path: '$messaging',
}}, {$unwind: {
path: '$messaging.messages',
}}, {$project: {
messaging: {
ourNumber: 1,
messages: {
contact: 1,
contactedNumberMessages: {
$filter: {
input: "$messaging.messages.contactedNumberMessages",
as: "message",
cond: {
$eq: ["$$message.direction", "out"]
}
}
}
}
}
}}]
由于您在数组和子数组中嵌套了数组,过滤阶段没有得到正确的输出,我添加了 unwind 以获得 field:messaging.messages.contactedNumberMessages
的正常数组
如果需要,您可以再次执行 groupby 以确保您获得预期格式的文档,因为展开后它将为展开的数组中的每个文档创建多个聚合文档。
在 MongoDB 中,我有一个消息集(在下面找到):
我有兴趣通过 id 查询父文档,并说过滤 contactedNumberMessages
以仅包含传入消息(方向为“in”的消息)所以我用 Mongoose 编写了以下代码,但是 contactedNumberMessages
在返回的数据中是 null
,关于我为什么得到 null
的任何线索?谢谢
Messages.aggregate([
{
$match: {
_id: id
}
},
{
$project: {
messaging: {
ourNumber: 1,
messages: {
contact: 1,
contactedNumberMessages: {
$filter: {
input: "$contactedNumberMessages",
as: "message",
cond: {
$eq: ["$$message.direction", "out"]
}
}
}
}
}
}
}
]);
{
"_id": {
"$oid": "612f4e32aa56064f1608c2eb"
},
"messaging": [
{
"ourNumber": "+15123568549",
"messages": [
{
"contact": "+21629000111",
"contactedNumberMessages": [
{
"direction": "out",
"content": "Hello!",
"when": {
"$date": "2021-09-23T23:00:00.000Z"
},
"nature": "SMS"
},
{
"direction": "in",
"content": "Hi!",
"when": {
"$date": "2021-09-23T23:00:00.000Z"
},
"nature": "SMS"
}
]
}
]
}
]
}
请参考这里的例子:https://mongoplayground.net/p/9toRoa_5IE9
您应该在聚合中使用如下内容:
[{$match: {
_id: ObjectId('612f4e32aa56064f1608c2eb')
}}, {$unwind: {
path: '$messaging',
}}, {$unwind: {
path: '$messaging.messages',
}}, {$project: {
messaging: {
ourNumber: 1,
messages: {
contact: 1,
contactedNumberMessages: {
$filter: {
input: "$messaging.messages.contactedNumberMessages",
as: "message",
cond: {
$eq: ["$$message.direction", "out"]
}
}
}
}
}
}}]
由于您在数组和子数组中嵌套了数组,过滤阶段没有得到正确的输出,我添加了 unwind 以获得 field:messaging.messages.contactedNumberMessages
的正常数组如果需要,您可以再次执行 groupby 以确保您获得预期格式的文档,因为展开后它将为展开的数组中的每个文档创建多个聚合文档。