Я не могу повторить обновление массива Монго в Java - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть база данных со следующей структурой:

{
    "_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 во встроенных документах.Запрос, который изменяет это значение в монго, выглядит следующим образом:

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.IllegalArgumentException: Неверное имя поля BSON BASEDATOS. $. IsContingenciaBD

1 Ответ

1 голос
/ 19 сентября 2019

Похоже, вы используете данные внутри метода 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
...