我正在尝试从数组中删除重复值,我可以通过以下查询成功实现,但是有困难跳过键,其中值为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
}
答案 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'进行分组,以便它不考虑空值,但可能导致性能下降。