MongoDB聚合- $lookup未将“as”分组

efzxgjgh  于 2022-12-26  发布在  Go
关注(0)|答案(1)|浏览(154)

我想要做的是将bookmarks与其文档状态为activatedevents连接起来。并且我还想用连接的数据列表替换根。因此,我当前正在运行如下查询:

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'

我的查询只有当所有的文档都完全连接时才起作用.用连接的数据列表替换根目录的最佳方法是什么?

bxgwgixi

bxgwgixi1#

基于此评论:
我的确切要求是排除空事件,并且不计算排除的文档。
我认为这里的解决方案是使用默认的$unwind设置。目前您在$unwind阶段专门将preserveNullAndEmptyArrays设置为true。根据文档,此参数的描述如下:
可选。

  • 如果为true,并且路径为null、缺少或为空数组,则$unwind输出文档。
  • 如果false、path为null、缺少或为空数组,则$unwind不输出文档。

默认值为false
因此,管道中的尾随$facet接收(并因此计数)空文档,这正是因为您要跳过循环(通过$unwind中的保留设置和$replaceRoot中的$ifNull)才能将它们送到那里。

{
        "$unwind": {"path": "$events", "preserveNullAndEmptyArrays": False}
    },

或者,由于这是默认值,您可以使用更简单的语法:

{
        "$unwind": "$events"
    },

您可以在this playground sandbox中使用preserveNullAndEmptyArrays设置,简单的语法变体是here

相关问题