是否有一种简单的方法来“$ push”文档的所有字段? 例如:
说我有一本Mongo藏书:
{author: "tolstoy", title:"war & peace", price:100, pages:800}
{author: "tolstoy", title:"Ivan Ilyich", price:50, pages:100}
我想按作者对它们进行分组 - 对于每个作者,列出他的整个书籍对象:
{ author: "tolstoy",
books: [
{author: "tolstoy", title:"war & peace", price:100, pages:800}
{author: "tolstoy", title:"Ivan Ilyich", price:50, pages:100}
]
}
我可以通过明确推送所有字段来实现这一目标:
{$group: {
_id: "$author",
books:{$push: {author:"$author", title:"$title", price:"$price", pages:"$pages"}},
}}
但是有没有捷径,包括:
// Fictional syntax...
{$group: {
_id: "$author",
books:{$push: "$.*"},
}}
答案 0 :(得分:78)
您可以使用$$ ROOT
{ $group : {
_id : "$author",
books: { $push : "$$ROOT" }
}}
在此处找到:how to use mongodb aggregate and retrieve entire documents
答案 1 :(得分:4)
实际上,你根本无法达到你的意思,你需要$unwind
db.collection.aggregate([
{$unwind: "$books"},
{$group: {
_id: "$author",
books:{$push: {
author:"$books.author",
title:"$books.title",
price:"$books.price",
pages:"$books.pages"
}},
}}
])
这就是你如何处理聚合中的数组。
您正在寻找快捷键入所有字段不存在的内容。
但特别是因为你必须做的事情,那么你无法那样做,因为你在某种程度上重塑了文件。
答案 2 :(得分:1)
如果问题是您不想显式写入所有字段(如果您的文档有很多字段,并且结果中需要所有字段),您也可以尝试使用Map-Reduce:
db.books.mapReduce(
function () { emit(this.author, this); },
function (key, values) { return { books: values }; },
{
out: { inline: 1 },
finalize: function (key, reducedVal) { return reducedVal.books; }
}
)