从mongo更新内部文档

时间:2013-07-26 13:13:36

标签: java mongodb

这是我的示例文档。

{
    "_id" : ObjectId("51f20148a85e39af87510305"),
    "group_name" : "sai",
    "privileges" : [
        "Notification",
        "News Letter"
    ],
    "users" : [
        {
            "full_name" : "sumit",
            "user_name" : "sumitdesh",
            "password" : "magicmoments",
            "status" : "Active"
        },
        {
            "full_name" : "ad",
            "user_name" : "asd",
            "password" : "asdf",
            "status" : "Active"
        }
    ]
}

我想用一个新文档替换users数组中的内部文档。

这是我的java代码:

BasicDBObject g1=new BasicDBObject();
g1.put("full_name", "ram");
g1.put("user_name", "ram123");
g1.put("password", "pass$123");
g1.put("status", "Inactive");
BasicDBObject doc=new BasicDBObject();
doc.put("users",g1);
BasicDBObject q=new BasicDBObject("users.user_name","asd");
con.update(q,doc);

感谢任何帮助

预期输出如下 我想用这些值替换内部文档

{
        "_id" : ObjectId("51f20148a85e39af87510305"),
        "group_name" : "sai",
        "privileges" : [
            "Notification",
            "News Letter"
        ],
        "users" : [
            {
                "full_name" : "sumit",
                "user_name" : "sumitdesh",
                "password" : "magicmoments",
                "status" : "Active"
            },
            {
                "full_name" : "ram",
                "user_name" : "ram123",
                "password" : "pass$123",
                "status" : "Inactive"
            }
        ]
    }

3 个答案:

答案 0 :(得分:1)

我必须合并$set$运算符,然后才能更新数组的特定项。

BasicDBObject g1 = new BasicDBObject();
g1.put("users.$.full_name", "ram");
g1.put("users.$.user_name", "ram123");
g1.put("users.$.password", "pass$123");
g1.put("users.$.status", "Inactive");

BasicDBObject doc = new BasicDBObject();
doc.put("$set", g1);

BasicDBObject q = new BasicDBObject("users.user_name","asd");
con.update(q,doc);

答案 1 :(得分:0)

您的代码将创建一个仅包含新用户的新文档。要向现有文档中的数组添加新元素,请使用$ push运算符

BasicDBObject where = new BasicDBObject("_id", new ObjectId("51f20148a85e39af87510305");
BasicDBObject doc = //... your new user object
BasicDBObject push = new BasicDBObject("$push", doc);
con.update(where, push);

要修改现有文档的字段,可以将set-operator与$ -placeholder结合使用。这会将user_name从“foo”更改为“bar”

BasicDBObject where =  new BasicDBObject("users.user_name", "foo");
BasicDBObject value =  new BasicDBObject("users.$.user_name", "bar");
BasicDBObject set = new BasicDBObject("$set", value);
con.update(where, set);

但最不吸引人的方法是在从数据库中检索对象时,保持整个DBObject,镜像DBObject中的所有修改,然后调用

con.save(dbObject);

ORM包装器库可以为您完成此操作。但虽然这是最简单的方法,但它并不是最有效的方式,因为整个文档将被发送到数据库。这是一个问题,当写入不频繁且文档很小时,可以很容易地在“过早优化”下提交,但是当你经常保存并拥有大量文档时,它可能会成为一个问题。

答案 2 :(得分:0)

如果您按照文档进行操作,这实际上非常简单。

第一个难点是找到要更新的文档。您正在寻找user_name字段为' asd'的用户,这完全通过以下查询完成:

{'users.user_name': 'asd'}

字段名称需要在mongo shell中进行转义(它是一个复合名称),但您不必担心Java中的内容。

现在您已找到您的用户,您需要更改它。 MongoDB神奇地将匹配的数组索引存储为$,允许您将更新条件写为:

{
    $set: {
        'users.$': {
            full_name: 'ram',
            user_name: 'ram123',
            password: 'pass$123',
            status: 'inactive'
        }
    }
}

您显然已经了解了Java连接器的方法,我将把JSON对象转换为BasicDBObject的实例。