蒙戈组和推: 推动所有领域

有没有一种简单的方法来“ $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: "$.*"},
}}
62141 次浏览

实际上你根本不能达到你所说的,你需要 $放松

db.collection.aggregate([
{$unwind: "$books"},


{$group: {
_id: "$author",
books:{$push: {
author:"$books.author",
title:"$books.title",
price:"$books.price",
pages:"$books.pages"
}},
}}
])

这就是在聚合中处理数组的方法。

以及您正在寻找的快捷键入所有字段 根本不存在,但。

但特别是因为你必须做什么,然后你 不能做,无论如何,因为你是在一种方式,重塑文件。

如果问题是你不想显式地写所有的字段(如果你的文档有很多字段并且你需要所有的字段) ,你也可以尝试用 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; }
}
)

可以使用 $$ROOT

{ $group : {
_id : "$author",
books: { $push : "$$ROOT" }
}}

在这里发现: 如何使用 mongodb 聚合和检索整个文档