Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从mongo更新内部文档_Java_Mongodb - Fatal编程技术网

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'
        }
    }
}