我想要做的是将bookmarks
与其文档状态为activated
的events
连接起来。并且我还想用连接的数据列表替换根。因此,我当前正在运行如下查询:
db.bookmarks.aggregate(
[
{
"$lookup": {
"from": "events",
"let": {"eventId": "event_id"},
"pipeline": [
{
"$match": {"$expr": {"$and": [{"$eq": ["$_id", "$$eventId"]}, {"$eq": ["$status", "activated"]}]}
}
],
"as": "events"
}
},
{
"$unwind": {"path": "$events", "preserveNullAndEmptyArrays": True}
},
{
"$replaceWith": "$events"
},
{
"$facet": {
"page_info": [{"$count": "total_count"}],
"data_list": {
[{"$skip": 0}, {"$limit": 10}]
}
}
}
]
)
但这里有个问题,当事件的状态与activated
不匹配时,会导致如下错误:
PlanExecutor error during aggregation :: caused by :: 'replacement document' must evaluate to an object, but resulting value was: MISSING. Type of resulting value: 'missing'
我的查询只有当所有的文档都完全连接时才起作用.用连接的数据列表替换根目录的最佳方法是什么?
1条答案
按热度按时间bxgwgixi1#
基于此评论:
我的确切要求是排除空事件,并且不计算排除的文档。
我认为这里的解决方案是使用默认的
$unwind
设置。目前您在$unwind
阶段专门将preserveNullAndEmptyArrays
设置为true
。根据文档,此参数的描述如下:可选。
true
,并且路径为null、缺少或为空数组,则$unwind
输出文档。false
、path为null
、缺少或为空数组,则$unwind
不输出文档。默认值为
false
。因此,管道中的尾随
$facet
接收(并因此计数)空文档,这正是因为您要跳过循环(通过$unwind
中的保留设置和$replaceRoot
中的$ifNull
)才能将它们送到那里。或者,由于这是默认值,您可以使用更简单的语法:
您可以在this playground sandbox中使用
preserveNullAndEmptyArrays
设置,简单的语法变体是here。