MOngoDB с Java: - PullRequest
       1

MOngoDB с Java:

0 голосов
/ 03 сентября 2018

Предположим, мои данные такие:

([{

attribute: 'amount'
rank: 1
value: '500'
rules:
    [{
        name:'R1',
        parent: 'true',
        successor_attr: 'project',
    },

        name:'R2',
        parent: 'true',
        successor_attr: 'type',
    }]
})]

Теперь, в правилах списка, я хочу добавить объект, если его нет, или оставить его как есть, по сути, операция «upsert». Чтобы добиться того же, я пытался:

BasicDBObject criteria = new BasicDBObject();
criteria.append("attribute", doc.getString("attribute"));
criteria.append("value", doc.getString("value"));
criteria.append("rank", doc.getInteger("rank"));
criteria.append("rules.name", list.getString("name"));
criteria.append("rules.parent", list.getString("parent"));
criteria.append("rules.successor_attr", list.getString("attribute"));

//To add the object if not present already.
BasicDBObject docdetail = new BasicDBObject();
docdetail.put("name", list.getString("name"));
docdetail.put("parent", list.getString("parent"));
docdetail.put("successor_attr", list.getString("attribute"));

BasicDBObject modifiedObject = new BasicDBObject();
modifiedObject.put("$push", new BasicDBObject().append("rules",docdetail));
collection1.update(criteria,modifiedObject,true,false);

При попытке сделать то же самое, я получаю сообщение об ошибке:

Write failed with error code 2 and error message 'The field 'rules' must     be an array but is of type object in document {no id}'

Ошибка в последней строке (collection1.update ...). Пожалуйста, предложите, как я могу удалить эту ошибку и достичь желаемой функциональности.

1 Ответ

0 голосов
/ 03 сентября 2018

Ваш criteria для правил выглядит немного не так, поскольку все три атрибута установлены в name для списка.

В противном случае, если вы хотите добавить только правило, которое еще не существует, используйте оператор addtoset вместо push. Это также описано в этом вопросе. Следуя вашему примеру кода:

BasicDBObject modifiedObject = new BasicDBObject();
modifiedObject.put("$addtoset", new BasicDBObject("rules", docdetail));
collection1.update(criteria, modifiedObject, false, false);

Обратите внимание, что вы не хотите вставлять в коллекцию, только в набор правил.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...