java中mongo数组中的访问元素
假设我在数据库中有以下mongo对象:
{ "_id" : ObjectId("4f904ebb5bebd4375b759c90"), "findme" : "someValue", "array" : [ { "id" : "1234" "Y" : "0" }, { "id" : "3456" "Y" : "0" }, { "id" : "5678" "Z" : "0" } ] }
我知道我可以用java中的以下点符号访问器更改数组内容…
BasicDBObject change = new BasicDBObject("findme", "someValue"); BasicDBObject setDoc = new BasicDBObject(); setDoc.append("array.0.Y", "0"); setDoc.append("array.1.Y", "0"); setDoc.append("array.2.Z", "0"); BasicDBObject account = new BasicDBObject("$set", setDoc); coll.update(change, account);
但是,如果我只知道id为“3456”而不是“数组”中的索引1,我将如何更改“3456”的“Y”的值? 我真的想在创建这些查询对象和更新方法时完成这个…换句话说,我宁愿不把整个对象拉出来并遍历“数组”来找出它的位置。
谢谢!
编辑:多个数组元素可以具有字段“Y”,如编辑的代码中所示。 我只想编辑特定元素的“Y”字段。
要使用Java驱动程序执行此操作,您可以执行以下操作:
DBObject queryForElem = new BasicDBObject("array", new BasicDBObject("$elemMatch", new BasicDBObject("id", "3456"))); DBObject updateMatchingElem = new BasicDBObject("$set", new BasicDBObject("array.$.Y", "1")); coll.update(queryForElem, updateMatchingElem);
鉴于这有点笨拙,您可以使用QueryBuilder,这样可以提高您的可读性:
DBObject queryForElem = QueryBuilder.start("array").elemMatch(new BasicDBObject("id", "3456")).get(); DBObject updateMatchingElem = new BasicDBObject("$set", new BasicDBObject("array.$.Y", "1")); coll.update(queryForElem, updateMatchingElem);
db.collection.update({array : {$elemMatch : {id : "3456"}}}, {$set : { 'array.$.Y' : '1' }})