【问题标题】:Mongo group and push: pushing all fieldsMongo group and push:推所有领域
【发布时间】:2014-03-03 15:08:06
【问题描述】:

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

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你可以使用 $$ROOT

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

    在这里找到:how to use mongodb aggregate and retrieve entire documents

    【讨论】:

    • 如何删除特定字段,exc 我想删除价格字段?
    【解决方案2】:

    其实你说的根本达不到,你需要$unwind

    db.collection.aggregate([
        {$unwind: "$books"},
    
        {$group: {
             _id: "$author",
             books:{$push: {
                 author:"$books.author",
                 title:"$books.title",
                 price:"$books.price",
                 pages:"$books.pages"
             }},
        }}
    ])
    

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

    您正在寻找的快捷方式键入所有字段的内容尚不存在

    但特别是因为你必须做的事情,那么你不能无论如何都这样做,因为你在某种程度上重塑了文档。

    【讨论】:

    • 非常感谢您的回复,但我的查询有效(在 mongo 2.4.9 上测试)。也许我的描述不清楚 - 如果是这样,请道歉。我从一个扁平的 Mongo 书籍收藏开始(完全“未缠绕”),我想将它们 分组 成提到的 auther+his 书籍列表格式。
    【解决方案3】:

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

    【讨论】:

    • 很好,谢谢 :) 恕我直言,对于“管道”语法,$push 不直接支持这样的“this”,这是一种耻辱。但是非常感谢这个有趣的选择。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 2013-02-16
    • 2018-07-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多