Mongo组和推:推动所有领域

时间:2014-03-03 15:08:07

标签: mongodb

是否有一种简单的方法来“$ 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: "$.*"},
}}

3 个答案:

答案 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; } 
    }
)