更新Mongo集合中数组中对象的字段是否在meteor.js中不起作用?

时间:2017-04-27 08:45:10

标签: mongodb meteor

我尝试使用位置$运算符来更新数组中对象字段的值,并使用了Mongo文档中的示例(docs.mongodb.com/manual/reference/operator/update/positional/) - 但是那个例子在流星中不起作用。这是我的错误还是流星中mongo的一些限制?这是代码:

if (Meteor.isServer) { 

console.info( "Create collection");
students = new Mongo.Collection('students');
console.info( "Clear collection from old data");
students.remove(); 

//***************************************************
console.info( "Insert data to collection");

if (students.find().count() === 0) {

  students.insert({
    _id: 4,
    grades: [
     { grade: 80, mean: 75, std: 8 },
     { grade: 85, mean: 90, std: 5 },
     { grade: 90, mean: 85, std: 3 }
      ]
    });

}

//***************************************************
console.info( "Update data in collection");

// Example from  https://docs.mongodb.com/manual/reference/operator/update/positional/
// Use the positional $ operator to update the value of the std field in the embedded document with the grade of 85:

students.update(
   { _id: 4, "grades.grade": 85 },
   { $set: { "grades.$.std" : 6 } }
);
console.info( "Update data in array with id 4 in collection - OK");


//***************************************************
console.info( "See updated data");

console.info("New data in the field std must be 6 but = " + students.findOne({_id: "4"}).grades[1].std);}

结果是相同的旧值“5”,没有任何错误消息。可能是Mongo doc中的示例不起作用的原因是什么?

1 个答案:

答案 0 :(得分:0)

此答案基于您在上述评论中提供的信息。您声明代码在您输入引号后立即开始正常工作,并询问这是否是一些特殊的MeteorJavaScript功能。答案是否定的,这不是一个特殊的功能

您需要引号才能使代码正常工作的原因是您将号码保存为Strings而不是Numbers。您需要重构插入/更新代码,以确保将85作为number插入而不是字符串。然后你可以删除引号,代码就可以了。

您可能认为没有必要这样做,因为一切都按预期工作但如果数字被保存为字符串然后对它们执行数学并使用$gt$lt稍后查询它们将是影响。

要将数字保存为numbers而不是strings,请确保在插入/更新时没有引号。您的当前代码似乎没有引号,但您的评论表明它之前已执行过。因此,通过运行meteor reset重置数据库,将运行插入脚本,然后如果删除引号,则只需添加代码即可按预期运行。