Java 从mongo更新内部文档
这是我的样本文件Java 从mongo更新内部文档,java,mongodb,Java,Mongodb,这是我的样本文件 { "_id" : ObjectId("51f20148a85e39af87510305"), "group_name" : "sai", "privileges" : [ "Notification", "News Letter" ], "users" : [ { "full_name" : "sumit", "user_name" : "s
{
"_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"
}
]
}
我想用新文档替换用户数组中的内部文档
这是我的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"
}
]
}
您的代码将创建一个仅由新用户组成的新文档。要向现有文档中的数组添加新元素,请使用$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运算符与$-占位符结合使用。这会将用户名从“foo”更改为“bar”
但最简单的方法是在从数据库检索对象时保留整个DBObject,镜像DBObject中的所有修改,然后调用
con.save(dbObject);
ORM包装器库可以为您做到这一点。但是,虽然这是最简单的方法,但不是最有效的方法,因为整个文档都将发送到数据库。当写操作不频繁且文档很小时,这是一个很容易在“过早优化”下解决的问题,但当您经常保存并且有大量文档时,这可能会成为一个问题。我必须组合and运算符,然后您可以更新数组的特定项
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);
如果遵循文档,这实际上相当简单 第一个困难是找到要更新的文档。您正在寻找
user\u 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
的实例留给您。我很确定您想要做的是可以实现的,但我很难理解它是什么。您是否可以编辑您的问题,以显示您期望输出BSON对象的示例?
{
$set: {
'users.$': {
full_name: 'ram',
user_name: 'ram123',
password: 'pass$123',
status: 'inactive'
}
}
}