当前位置: 首页 > 知识库问答 >
问题:

我不能用java复制mongo数组的更新

庄欣然
2023-03-14

我有一个具有以下结构的数据库:

{
    "_id" : ObjectId("5d54608122474f8d2927d898"),
    "NOMBRE_HOST" : "Base1",
    "IsContingenciaODA" : "false",
    "puerto" : "1532",
    "HostContigencia" : "Base2",
    "BASEDATOS" : [
        {
            "SID" : "REPOS",
            "IsContingenciaBD" : "false",
            "host" : "Base3",
            "puerto" : "1111"
        },
        {
            "SID" : "PRODM2",
            "IsContingenciaBD" : "false",
            "host" : "nb",
            "puerto" : "1111"
        },
        {
            "SID" : "PRODM3",
            "IsContingenciaBD" : "true",
            "host" : "Base4",
            "puerto" : "999"
        }
    ]
}
{
    "_id" : ObjectId("5d54608122474f8d2927d899"),
    "NOMBRE_HOST" : "172.0.0.1",
    "IsContingenciaODA" : "false",
    "puerto" : "1532",
    "HostContigencia" : "172.10.0.1",
    "BASEDATOS" : [
        {
            "SID" : "Base6",
            "IsContingenciaBD" : "false",
            "host" : "172.7.0.1",
            "puerto" : "999"
        }
    ]
}

我需要更新嵌入文档的IsContingenciaBD参数,在mongo中更改此值的查询如下:

db.PropertiesMQ.update({"NOMBRE_HOST" : "Base1", "BASEDATOS.SID" : "PRODM3"}, {$set: {"BASEDATOS.$.IsContingenciaBD" : "true"}})

我尝试使用以下代码在 java 中复制此查询:

        MongoClient client = new MongoClient("my_ip", "my_port");
        MongoDatabase mongodb = client.getDatabase("prueba");
        MongoCollection<Document> collection = mongodb.getCollection("PropertiesMQ");
        BasicDBObject filter = new BasicDBObject();
        filter.put("NOMBRE_HOST", host);
        filter.put("BASEDATOS.SID", sid);
        BasicDBObject data = new BasicDBObject();
        data.put("BASEDATOS.$.IsContingenciaBD", state);
        BasicDBObject command = new BasicDBObject();
        command.put("$set", data);
        System.out.println(filter + ", " + command);
        collection.updateOne(filter, data);
        client.close();

执行它时,我收到以下错误:

线程"main"中的异常java.lang.IllegalArgument异常:无效的BSON字段名BASEDATOS.$. IsContingenciaBD

共有1个答案

蓬祺
2023-03-14

看起来你在updateOne方法中使用数据。相反,它应该是命令BasicDBObject。像下面一样,

    MongoCollection<Document> collection = mongodb.getCollection("PropertiesMQ");
    BasicDBObject filter = new BasicDBObject();
    filter.put("NOMBRE_HOST", host);
    filter.put("BASEDATOS.SID", sid);
    BasicDBObject data = new BasicDBObject();
    data.put("BASEDATOS.$.IsContingenciaBD", state);
    BasicDBObject command = new BasicDBObject();
    command.put("$set", data);
    System.out.println(filter + ", " + command);
    collection.updateOne(filter, command); //Use Command instead of data
 类似资料:
  • 问题内容: 我有一个a不断更新的数组。比方说。我需要制作一个完全相同的副本a并称之为b。如果a要改成,b应该还是。做这个的最好方式是什么?我尝试了像这样的循环: 但这似乎无法正常工作。请不要使用深层复制等高级术语,因为我不知道这意味着什么。 问题答案: 你可以尝试使用System.arraycopy()

  • 主要内容:使用 copyOf() 方法和 copyOfRange() 方法,使用 arraycopy() 方法,使用 clone() 方法所谓复制数组,是指将一个数组中的元素在另一个数组中进行复制。本文主要介绍关于 Java 里面的数组复制(拷贝)的几种方式和用法。 在 Java 中实现数组复制分别有以下 4 种方法: Arrays 类的 copyOf() 方法 Arrays 类的 copyOfRange() 方法 System 类的 arraycopy() 方法 Object 类的 clone

  • 我有以下代码 我的期望是,若map中并没有值(数组),它将返回对新创建的数组的引用,我可以将我的“值”添加到该数组中。 然而,我看到myContext映射是空的。看起来超基本的,我不明白。

  • 这是我正在使用的代码,从csv中获取行,将它们存储到一个名为userDetails的字符串数组中,然后从这个数据中获取从第四个值开始的userDetails的所有值(userDetails[3]),并将它们放入一个名为scores的二维整数数组中。 台词: 创建用户类的新实例,并传递3个字符串(第一个=用户名,第二个=密码,第三个=用户类型(无论是教师、学生还是管理员)),连同这3个字符串,它传递

  • 给定集合"foo",我们有字段"bar",看起来像这样: 如何查询字段“bar”上满足以下条件的所有“foo”:[14,18]中的“uid”=2和“mid”

  • 我仍在学习封装。我有一个,其中每个emcapsulated都有一个数组,以及它们的所有设置程序 现在在我的程序中,我注意到数组listRule(其中添加了与语法相关的规则)在每次添加新语法时都会被覆盖。我已经能够识别出错误发生在会清空listRule中所有其他语法的内容,因此listRule似乎对所有语法都是一样的。我的数组listRule创建不正确还是我的循环?