db.name.aggregate()函数的输出如下:
[{}, {"abc": "zyx"}, {}, "opk": "tyr"]
所需实际输出:
[{"abc": "zyx"}, "opk": "tyr"]
huwehgph1#
首先,您的输出不是一个有效的数组。它应该是这样的:
[{}, {"abc": "zyx"}, {}, {"opk": "tyr"}]
现在,要获得所需的输出,可以将以下$match级添加到管道中:
$match
db.collection.aggregate([ { "$match": { $expr: { "$gt": [ { "$size": { "$objectToArray": "$$ROOT" } }, 0 ] } } } ])
这里,我们使用$objectToArray将文档转换为数组,然后检查该数组的大小是否大于0。只有那些文档保留在输出中。Playground link.
$objectToArray
puruo6ea2#
如果数据看起来像这样。
[ { "arr": [ {}, { "abc": "zyx" }, {}, { "opk": "tyr" } ] } ]
这样可以清除空对象的聚集
db.collection.aggregate([ { "$unwind": { "path": "$arr", } }, { "$match": { arr: { "$ne": {} } } }, { "$group": { _id: "$_id", arr: { $push: "$arr" } } } ])
Outputs
[ { "_id": ObjectId("5a934e000102030405000000"), "arr": [ { "abc": "zyx" }, { "opk": "tyr" } ] } ]
Demo@mongoplaygroundhttps://mongoplayground.net/p/BjGxzlrlj6s
2条答案
按热度按时间huwehgph1#
首先,您的输出不是一个有效的数组。它应该是这样的:
现在,要获得所需的输出,可以将以下
$match
级添加到管道中:这里,我们使用
$objectToArray
将文档转换为数组,然后检查该数组的大小是否大于0。只有那些文档保留在输出中。Playground link.
puruo6ea2#
如果数据看起来像这样。
这样可以清除空对象的聚集
Outputs
Demo@mongoplayground
https://mongoplayground.net/p/BjGxzlrlj6s