2017-11-15 7 views
0

こんにちは私はいくつかのユーザーレコードを持つ文書を持っています。MongoDBが誤った配列要素を更新します

"profile":{ 
    "records":[ 
       { 
       "classId": "LngdsQfL", 
       "moduleId": "5CDEezDJ", 
       "sectionId": "nFMu3mwa", 
       "dateFinished": "", 
       "dateOpened": "2017-11-15T19:48:20.819Z" 
       }, 
       { 
       "classId": "7Smq5sG", 
       "moduleId": "5CDEezDJ", 
       "sectionId": "nFMu3mwa", 
       "dateFinished": "", 
       "dateOpened": "2017-11-15T19:19:08.669Z" 
       } 
      ] 
     } 

ただし、2番目のレコードを更新しようとすると、最初のクエリが更新されます。そして2番目のものは同じままです。

var classId= "7Smq5sG"; 
var moduleId = "5CDEezDJ"; 
var sectionId = "nFMu3mwa"; 
var date = new Date(); 

Users.update(
       { _id:Meteor.userId() , 

       'profile.records.classId' : classId, 
       'profile.records.moduleId' : moduleId, 
       'profile.records.sectionId' : sectionId, 
       },{ 
       $set : { 
       "profile.records.$.dateOpened": date 
       } 
      }); 
    } 

私は何が欠けていますか?

+0

最初のレコードを更新しているとはどのように分かりますか?あなたの 'Meteor.userId()'は何ですか? –

+0

私はMeteor jsを使用しています。Meteor.userId()は現在のユーザーのIDを返します。データベースをチェックすると、最初のレコードが更新されたことがわかります。 – dionysosz

+0

これはMongoDB v3.6を使用している場合にのみ可能です。これは文字通り数時間以内にリリースされます。 – dnickless

答えて

2

は、次のように要求を使用してみてください:

Users.update(
    {_id:Meteor.userId(), 
    'profile.records': {$elemMatch: { 
            'moduleId': {$eq: moduleId}, 
            'sectionId': {$eq: sectionId}, 
            'classId': {$eq: classId} 
            } 
         } 
    }, 
    {$set: {'profile.records.$.dateOpened': date}}); 

これは、複数のクエリ基準に一致する配列の要素を見つけるために、$ elemMatch演算子を使用しています。

+0

優秀!これはトリックでした!ありがとう – dionysosz

関連する問題