这是我的示例文档。
{
"_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"
}
]
}
答案 0 :(得分:1)
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
的实例。