Mongo组和推:推动所有领域

Pel*_*ani 36 mongodb

有没有一种简单的方法来"$ push"文档的所有字段?例如:

说我有一本Mongo书籍集:

{author: "tolstoy", title:"war & peace", price:100, pages:800}
{author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}
Run Code Online (Sandbox Code Playgroud)

我想按作者对它们进行分组 - 对于每个作者,列出他的整个书籍对象:

{ author: "tolstoy",
  books: [
     {author: "tolstoy", title:"war & peace", price:100, pages:800}
     {author: "tolstoy", title:"Ivan Ilyich", price:50,  pages:100}
  ]
}
Run Code Online (Sandbox Code Playgroud)

我可以通过明确推送所有字段来实现这一点:

{$group: {
     _id: "$author",
     books:{$push: {author:"$author", title:"$title", price:"$price", pages:"$pages"}},
}}
Run Code Online (Sandbox Code Playgroud)

但是有没有捷径,有以下几点:

// Fictional syntax...
{$group: {
    _id: "$author",
    books:{$push: "$.*"},
}}
Run Code Online (Sandbox Code Playgroud)

Jur*_*ius 93

你可以使用$$ ROOT

{ $group : {
            _id : "$author",
            books: { $push : "$$ROOT" }
        }}
Run Code Online (Sandbox Code Playgroud)

在这里找到:如何使用mongodb聚合并检索整个文档


Nei*_*unn 5

实际上,您根本无法实现您所说的内容,您需要$ unwind

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

    {$group: {
         _id: "$author",
         books:{$push: {
             author:"$books.author",
             title:"$books.title",
             price:"$books.price",
             pages:"$books.pages"
         }},
    }}
])
Run Code Online (Sandbox Code Playgroud)

这就是您处理聚合数组的方式。

而你想找什么样的快捷键键入所有的字段不存在,但。

但是特别是由于您必须执行的操作,您将无法按照您的方式进行任何操作,从而改变了文档的形状。