2017-04-27 11 views
0

位置$演算子を使って配列のオブジェクトフィールドの値を更新しようとしましたが、Mongoドキュメント(docs.mongodb.com/manual/reference/operator/update/positional/)の例を使用しましたが、例は流星では機能しませんでした。流星の中のmongoの私の誤りかいくつかの制限ですか?コードは次のとおりです。Mongoコレクションのオブジェクト配列の更新はmeteor.jsでは機能しませんか?

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の例がうまくいかない理由は何でしょうか?

+0

位置$演算子はMeteorで動作しますが、まだコードが機能していない理由はわかりません... – Sean

+0

引用符を置くとすべてが動作し始めます: –

+0

引用符を置くとすべて作業を開始します: 'students.update( {_id:" 4 "、" grades.grade ":" 85 "}、 {$ set:{"成績$ std ":" 6 "}}'流星やJSの特集:-)?私はそれが他の誰かに役立つことを願っています:-) –

答えて

0

この回答は、上記のコメントに記載されている情報に基づいています。引用符を付けるとすぐにコードが完全に動作するようになり、これが特殊なものであるかどうか尋ねられます。MeteorまたはJavaScript機能です。答えはいいえ、特別な機能ではありません。

コードを動作させるために引用符が必要な理由は、Numbersの代わりにStringsというように番号を保存しているためです。 85を文字列ではなくnumberとして挿入するように、挿入/更新コードをリファクタリングする必要があります。引用符を削除すると、コードが機能します。

数字が文字列として保存されていて、数値を入力して$gtまたは$ltを使用してクエリを実行すると、後で影響を受ける可能性があるため、これを行う必要はないと思われるかもしれません。

stringsの代わりにnumbersとして番号を保存するには、それらを挿入/更新するときに引用符がないことを確認してください。あなたの現在のコードには引用符は含まれていませんが、あなたのコメントにはそれ以前に行ったことが書かれているようです。したがって、meteor resetを実行してDBをリセットすると、挿入スクリプトが実行され、引用符を削除するとコードが期待どおりに実行されます。

+0

ありがとうございます、データの種類にもっと注意を払う必要があることがわかります(私はJSとMeteorとMongoの両方を一から研究しています。 –

関連する問題