给定一个包含任意数组的MongoDB
文档集合,可以根据数组的长度对文档进行排序。
我看到可以使用aggregation
或存储数组长度的附加字段来访问它。
我正在处理一种QueryBuilder
并没有使用aggregation
,所以我选择添加另一个字段。
所以我需要一个迁移脚本来更新集合的所有文档,以便添加一个字段,其中包含每个文档的数组长度。
通过对所有集合进行一次更新操作,可以实现此更新吗?怎么样?
我为此尝试aggregation
,我得到每个文档的每个数组的长度,但我不知道如何使用更新文档。
答案 0 :(得分:3)
我在我的一个系列上测试了它,它运行正常。
“评论”是一个无论如何的数组。保存后,数组的大小在“comments_size”中。
请确保在此操作期间没有任何并发写入。
db.posts.find({}).forEach(
function(doc) {
var size = doc.comments.length;
doc.comments_size = size;
db.posts.save(doc);
}
)
答案 1 :(得分:1)
如评论中所述,您可以使用聚合返回的游标逐个更新文档。这是一个如何在shell中完成它的快速示例:
var cursor = db.collection.aggregate([{
$group: {
"_id": "$id",
arrayLength: { $size: "$array" }
}
}]);
cursor.forEach( function(doc) {
db.collection.update({ 'id': doc.id },{ arrayLength: doc.arrayLength });
});