2017-07-19 85 views
1

我有一个集“首选项”与文档结构如下的MongoDB - 更新特定数组元素

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

我想更新与帐户及状态的状态日期字段lastSent。以下是我从Java代码中获得的查询。

选择查询:

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

更新查询:

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

上面的查询如下是给错误:

虚线场 '首选项$ lastSent。' 在“VAL .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

我只是在蒙戈你的代码测试shell中的代码工作正常,你不必提

$日期

我用这个代码更新日期

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

$ date只是java中查询的toString()值。它并不总是与我们在shell中编写的类似。反正谢谢你。 –