MongoDB聚合跳过空值键

时间:2016-12-18 20:58:23

标签: arrays json mongodb

我正在尝试从数组中删除重复值,我可以通过以下查询成功实现,但是有困难跳过键,其中值为null。我正在使用以下代码

db.mobile_data.aggregate([{$unwind: '$All_Participants'}, 
{$group: {_id:'$_id',All_Participants: {$addToSet: '$All_Participants'}, 
  Chat_group: {$first: '$Chat_group'}, Message_id: {$first: '$Message_id'} }}]);

我的输出结果如下

{ 
    "_id" : ObjectId("5856b1e39a47e6d13dab370b"), 
    "All_Participants" : [
        "user1", 
        "user4"
    ], 
    "Chat_group" : 67.0, 
    "Message_id" : Null
}

如果value为null,如何忽略Message_id?预期的输出应该是

{ 
    "_id" : ObjectId("5856b1e39a47e6d13dab370b"), 
    "All_Participants" : [
        "user1", 
        "user4"
    ], 
    "Chat_group" : 67.0
}

2 个答案:

答案 0 :(得分:0)

在展开' All_Participants'你可以使用 - > preserveNullAndEmptyArrays如果设置为false,则不会展开空字段。 你可以参考这个链接 - > https://docs.mongodb.com/v3.2/reference/operator/aggregation/unwind/

答案 1 :(得分:0)

不幸的是,在$ group阶段无法删除'null'字段。我们需要在$ group阶段之后添加一个附加的$ project阶段,以删除空字段:

db.mobile_data.aggregate([
{$unwind: '$All_Participants'}, 
{$group: {_id:'$_id',All_Participants: {$addToSet: '$All_Participants'}, 
  Chat_group: {$max: '$Chat_group'}, Message_id: {$first: '$Message_id'} }},

{$project: {'All_Participants': 1, 'Chat_group': 1, 'Message_id': {
            $cond: {
               if: { $ifNull: [ "$Message_id", true ] },
               then: "$$REMOVE",
               else: "$Message_id"
            }}}}]);

如果任何其他属性(例如'Chat_group')可以为null,则将再次需要类似的条件投影。 还要注意,我已经使用$ max而不是$ first来对'Chat_group'进行分组,以便它不考虑空值,但可能导致性能下降。