【问题标题】:Updating an object within an array using Mongo and Meteor使用 Mongo 和 Meteor 更新数组中的对象
【发布时间】:2015-05-05 00:09:01
【问题描述】:

在我的 Meteor 应用程序中,我有一个文档(来自 mongo 集合),其中的一部分数据是一个对象数组。

我创建了一个遍历对象数组的循环,使用来自每个数组索引中的对象的信息来计算新的数据点。 (具体来说,使用平均值来计算方差和标准差)。

然后我想在该数组索引处更新对象,以包含新数据点(方差和标准差)。

JSON 对象:

    "row_sum" : [
    {
        "name" : "Total Inches of Rainfall",
        "row_int" : 1,
        "mean" : 14.492753623188406
    },
    {
        "name" : "Inches Above/Below (+/-)135 Year Average",
        "row_int" : 2,
        "mean" : 0.13043478260869565
    }
],

我想要的输出是:

    "row_sum" : [
    {
        "name" : "Total Inches of Rainfall",
        "row_int" : 1,
        "mean" : 14.492753623188406
        "variance" : 1234,
        "sd" : 1111
    },
    {
        "name" : "Inches Above/Below (+/-)135 Year Average",
        "row_int" : 2,
        "mean" : 0.13043478260869565,
        "variance" : 1234,
        "sd" : 1111
    }
],

这是我当前的输出:

    "row_sum" : [
    {
        "name" : "Total Inches of Rainfall",
        "row_int" : 1,
        "mean" : 14.492753623188406
    },
    {
        "name" : "Inches Above/Below (+/-)135 Year Average",
        "row_int" : 2,
        "mean" : 0.13043478260869565
    },
    {
        "variance" : 48.24328113588513,
        "sd" : 6.945738343465375
    },
    {
        "variance" : 48.024652540384196,
        "sd" : 6.929982145747866
    }
],

如您所见,它只是将数据作为新对象附加到对象数组中,而不是更新数组循环中索引的特定对象。

这是包含循环和 Mongo 更新命令的代码部分:

for (var i = 0; i < row_sum.length; i++){
        var variance = this.calculate_variance(data_summary_id, row_sum[i]);    
        var standard_deviation = Math.sqrt(variance);
         var sum_data = {
                    row_sum : { 
                        variance: variance,
                        sd: standard_deviation
                }
            }
        DataSetSummary.update(data_summary_id, {$push: sum_data});

    }   

【问题讨论】:

    标签: mongodb meteor


    【解决方案1】:

    尝试 $set 方法和位置运算符 $ 。使用以下查询

    db.test.update({"row_sum.row_int":1},{$set:"row_sum.$.variance":1,"row_sum.$.sd" : 6.9}})
    

    由于它是行中的一个元素,您将不得不使用位置参数尝试以下问题 more answer

    【讨论】:

    • 您不能将位置运算符与upsert 一起使用,并且在这种情况下确实不需要该选项,因为它正在更新现有的数组元素。您还需要主文档_id 值作为查询的一部分,因为这完全是关于更新一个文档,实际上是每次更新一个数组元素。否则基本原理是正确的。
    • 如果您可以添加一些 JavaScript 代码作为示例,说明如何根据问题中已经给出的代码构建和执行该代码,那就太好了。对于这样一个有用的例子,甚至可能会让你获得更多的支持:)
    • 抱歉兄弟不太懂java脚本
    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多