Элемент массива обновления документа MongoDB с использованием метода findOneAndUpdate в Java - PullRequest
1 голос
/ 03 февраля 2020

Может кто-нибудь взглянуть на эту проблему, так как мы не можем вставить массив в поле 'd', как показано на рисунке ниже:

JSON Structure in MongoDB

Мы запрашиваем документ для обновления любого поля в массиве ps, а также вставляем массив в поле d, как показано ниже.

public void updateTesting() {
    Bson where = new Document().append("_id", 123456789012345L).append("session.ps.apn","abcdef");
    Bson update1=new Document().append("th", "value3");

         Bson update = new Document()
                    .append("session.ps.$.apn", "klo");
         Bson set = new Document().append("$set", update).append("$addToSet", update1);
         List<Bson> list=new ArrayList<>();
         list.add(set);

         tim.findOneAndUpdate(where , set);

}

В приведенном выше тестировании мы пытались вставка объекта в поле 'th', что успешно, но то же самое было невозможно для поля 'd'. Пожалуйста, дайте нам знать, что мы делаем не так здесь. Пожалуйста, прокомментируйте для любой необходимой информации. Заранее спасибо.

1 Ответ

1 голос
/ 03 февраля 2020

Вы должны использовать arrayFilters для обновления указанного c элемента массива (с условием). Фильтр массива в Java определяется с помощью объекта FindOneAndUpdateOptions.

List<Bson> arrFilters = new ArrayList<>();
arrFilters.add(new Document("elem.apn", "abcdef")); // this specifies the element search criteria
FindOneAndUpdateOptions updateOptions = new FindOneAndUpdateOptions().arrayFilters(arrFilters);

String [] dArray = { "app", "ban", "ora" }; // the "d" array to be added
Bson update = set("session.ps.$[elem].d", Arrays.asList(dArray));

String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));

Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
System.out.println(result);

Та же операция обновления в пн go Оболочка:

var dArray = [ "app", "ban" ];

db.test.updateOne(
   { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
   { $set: { "session.ps.$[elem].d" : dArray } },
   {
     arrayFilters: [ { "elem.apn": "abcdef" } ]
   }
)



[EDIT ADD]

Обновление apn одновременно с новым значением "newVal" и добавление нового строкового элемента "gua" в массив d (это добавит новый массив, если массив не существует):

db.test.updateOne(
   { _id: ObjectId("5e37dc262f5ff4dfc935eb6b") }, 
   { 
     $set: { "session.ps.$[elem].apn": "newVal" }
     $push: { "session.ps.$[elem].d" : "gua" } 
   },
   {
     arrayFilters: [ { "elem.apn": "abcdef" } ]
   }
)

Код Java для вышеуказанного пн go Код оболочки:

List<Bson> arrayFilters = new ArrayList<>();
arrayFilters.add(new Document("elem.apn", "abcdef"));
FindOneAndUpdateOptions updateOptions = 
    new FindOneAndUpdateOptions().arrayFilters(arrayFilters);   

Bson pushUpdate = push("session.ps.$[elem].d", "gua");
Bson setUpdate = set("session.ps.$[elem].apn", "newValue");
Bson update = combine(pushUpdate, setUpdate);

String idStr = "5e37dc262f5ff4dfc935eb6b";
Bson queryFilter = eq("_id", new ObjectId(idStr));

Document result = coll.findOneAndUpdate(queryFilter, update, updateOptions);
...