我有一个类似以下的文档:
你可以看到我有一个数组实体:{1,3,4}
现在我想在该数组中更改4到10并更新它,我有以下代码:
DBCollection coll = db.getCollection("test");
BasicDBObject newDocument = new BasicDBObject();
BasicDBObject searchQuery = new BasicDBObject().append("time", "20141105230000");
coll.update(searchQuery, newDocument);
String[] str = { "1", "3", "10" };
DBObject updateMatchingElem = new BasicDBObject("$set",
new BasicDBObject().append("entity", str));
coll.update(searchQuery, updateMatchingElem);
但这种方式不是一个好方法,因为我有点删除实体,然后再次插入整个数组。无论如何,我可以改变一个元素,如4到10?
答案 0 :(得分:2)
现在我想在该数组中更改4到10并更新它
您可以使用$位置运算符以下列方式执行此操作。
//db.collection.update({"entity":4},{$set:{"entity.$":10}})
DBObject find = new BasicDBObject( "entity", 4);
DBObject set = new BasicDBObject( "entity.$", 10);
DBObject update = new BasicDBObject().append("$set", set);
coll.update(find, update);
请注意,即使数组中还有其他匹配元素,您最多也只能更新一个匹配的数组元素。例如,如果数组中有两个4s
,则只会更新第一个出现的4个。这就是位置操作员的工作方式。
每当您在更新查询中使用位置运算符时,查找查询必须包含查询的find
部分中的字段。