【问题标题】:MongoDB update by aggregationMongoDB 通过聚合更新
【发布时间】:2015-02-11 16:13:56
【问题描述】:

我想将一个文件添加到文档中作为聚合的结果。

聚合返回多个项目,但更新只更新一个。

为什么只有一个?

这是我的代码

var maxCount = db.technology.aggregate({
     $group: {
         _id:"$_id", 
          stackMax: {
             $max:"$stackTimeLine.statistics.count"}
          }
     });

 while(maxCount.hasNext()) {
    var item=maxCount.next();  
    db.technology.update(
         {_id:item._id}, 
         {$set: {'stackTimeLine.latest':item.stackMax[0]}}
    );
 }

结果:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

【问题讨论】:

  • 如果您想要多次更新,您需要添加 multi:true。 db.collection.update( , , { multi: true } ) 尝试:db.technology.update( {_id:item._id}, {$set: {'stackTimeLine.latest':item.stackMax [0]}}, {'multi':true} );
  • 我试过了,没有运气。此外,每次更新都应该只更新一个条目。不需要“多”。
  • 您的聚合实际上并没有做任何事情。然后你将一个字段设置为它的当前值,所以它是一个空操作。您能描述一下您要添加到文档中的内容吗?
  • 我想从 statistics 数组中的字段 count 中获取最大值,并将该值分配给封闭文档中的新字段。聚合工作正常并返回预期结果,但更新不

标签: mongodb


【解决方案1】:

聚合结果不是游标,不能在上面使用hasNext()next()。例如,我的聚合输出是

{
    "result" : [ 
        {
            "_id" : [ 
                "8"
            ],
            "count" : 474
        }, 
        {
            "_id" : [ 
                "vista"
            ],
            "count" : 414
        }, 
        {
            "_id" : [ 
                "xp"
            ],
            "count" : 5112
        }
    ],
    "ok" : 1
}

然后我在aggregationResult.result上使用forEach()

var aggregationResult = db.Collection.aggregate(
[
   {$group : {_id : '$ps.d.Name', count : { $sum: 1 }}}
]);

aggregationResult.result.forEach(function(item)
{
    print(item);
})

您可以在forEach() 函数体中更新您的项目而不是print()

【讨论】:

  • 我把 print(item._id+' '+item.stackMax[0]) 放在 var item = ... 之后。所有条目均已打印,但仅更新 1
【解决方案2】:

感谢that guy找到解决方案的回答。

在 mongo shell 中聚合结果没有属性 result

如果从 forEach 中删除 result,则以前的答案可以正常工作

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2015-03-13
    • 1970-01-01
    • 2018-06-14
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    相关资源
    最近更新 更多