2017-07-19 7 views
1

私は、ユーザーIDとステータスに関する条件と日付フィールドlastSentを更新しようとしていますのMongoDB - 更新特定の配列要素

{ 
    _id: { 
     userId: "abc" 
    }, 
    val: { 
     status: 1, 
     prefs: [ 
      { 
       value: "condition", 
       lastSent: ISODate("2017-07-17T23:46:53.717Z") 
      } 
     ], 
     deal: 2, 
     prevDeal: 3 
    } 
} 

以下のように文書構造を持つコレクション「環境設定」を持っています。以下は私のJavaコードから導き出されたクエリです。

選択クエリ:

{ "_id" : { "userId" : "abc"} , "val.status" : 1 , "val.prefs.value" : "condition"} 

更新クエリ:

{ "$set" : { "val.prefs.$.lastSent" : { "$date" : "2017-07-17T23:50:07.009Z"}}} 

次のように上記のクエリがエラーを与えている: '。環境設定$ lastSent'

点線のフィールド「をヴァルで.prefs。$。lastSent 'は格納に有効ではありません。

どうすればよいですか?以下は

は私のJavaコードです:あなたが言及する必要はありません

BasicDBObject _idObject = new BasicDBObject(); 
_idObject.put("userId", "abc"); 

BasicDBObject _selectQuery = new BasicDBObject(); 
_selectQuery.put("_id", _idObject); 
_selectQuery.put("val.status", 1); 
_selectQuery.put("val.prefs.value", "condition"); 

BasicDBObject _valueUpdateQuery = new BasicDBObject(); 
_valueUpdateQuery.put("prefs.$.lastSent", lastSent); 

BasicDBObject _updateQuery = new BasicDBObject(); 
_updateQuery.put("$set", new BasicDBObject("val", _valueUpdateQuery)); 

prefs.update(_selectQuery, _updateQuery, true, true); 
+0

Javaコードを表示してください。 –

+0

編集にJavaコードを追加しました。チェックしてください。 @Héctor –

+1

それは間違っているからです。あなたは鍵を分けた。 '_updateQuery.put(" $ set "、新しいBasicDBObject(" val.prefs。$。lastSent "、lastSent));'でなければなりません。キーを入れ子にしても、実際には同じことを求めているわけではありません。 –

答えて

0

私はこのコードをシェルモンゴであなたのコードでテスト正常に動作

$日

と私は日付を更新するためにこのコードを使用しました

db.getCollection('tester').update({ "_id" : { "userId" : "abc"} , "val.status" : 1 , "val.prefs.value" : "condition"},{ "$set" : { "val.prefs.$.lastSent" : new Date()}}) 
+0

$ dateはjavaのqueryのtoString()値です。私たちがシェルで書いたものと必ずしも似ているとは限りません。とにかくありがとう。 –

関連する問題