2

假设我在数据库中有以下 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”而不知道它在“array”中的索引 1 处,我将如何更改“3456”的“Y”值?我真的很想在创建这些查询对象和更新方法的过程中完全实现这一点......换句话说,我宁愿不把整个对象拉出来并遍历“数组”来找出它的位置。

谢谢!

编辑:多个数组元素可以具有字段“Y”,如编辑的代码中所示。我只想编辑特定元素的“Y”字段。

4

2 回答 2

4

要使用 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);
于 2013-05-29T13:33:38.850 回答
0
db.collection.update({array : {$elemMatch : {id : "3456"}}}, {$set : { 'array.$.Y' : '1' }})
于 2013-05-29T00:52:00.877 回答