MongoDB $unwind保留空数组

MongoDB的aggregate的pipeline中,有 $unwind操作符,该操作符用于延展某一个数组类型的元素,作用与Python中的flatten(拍平)类似。但是在实际使用中,$unwind 有一个非常明显的问题,就是如果要unwind的字段为空数组或者不存在时,则不会输出该文档。这样会引发pipeline中的计数有问题或者文档条目数莫名的减少

方法一

在MongoDB 3.2和更高版本中, $unwind 运算符现在具有一些选项,其中特别是preserveNullAndEmptyArrays选项将解决此问题.

如果此选项设置为true,并且路径为空,缺少或为空数组,则 $unwind 输出文档.如果为假,则 $unwind 不会输出文档。路径为空,缺少或为空数组.在您的情况下,将其设置为true:

db.collection.aggregate([
    { "$unwind": {
            "path": "$solved",
            "preserveNullAndEmptyArrays": true
    } },
    { "$group": {
        "_id": "$_id",
        "login": { "$first": "$login" },
        "solved": { "$sum": "$solved.points" }
    } }
])

方法二

不使用 $unwind操作符,如果确定联表后的数组只有一个数组元素,直接在 $project使用$arrayElemAt操作符根据下标去获取数组中的元素即可。获取不到,对应的字段不会在文档中进行展示,但是会输出该文档。

pipeline = [
            {'$lookup': {'foreignField': 'dev_id', 'as': 'dev_info', 'from': 'device_info', 'localField': 'device_id'}},
      
            # {'$unwind': '$dev_info'},
            {'$project':
                {
                    'device_type': {"$arrayElemAt": ["$dev_info.dev_type", 0]},
                    'device_name': {"$arrayElemAt": ["$dev_info.dev_name", 0]}
                }
            }
        ]

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值