Шаблон MongA шаблона findAndModify возвращает нулевые значения для добавления или обновления вложенных элементов. - PullRequest
1 голос
/ 23 мая 2019

Мои данные отформатированы как:

{
    "_id" : "149",
    "books" : {
       "32" : "0.12",
       "33" : "0.21"
    }
}

Я хочу обновить / вставить значения во вложенный документ books.Если я вставлю новую строку, скажем "39" : "0.19", обновленный документ должен выглядеть следующим образом:

{
    "_id" : "149",
    "books" : {
       "32" : "0.12",
       "33" : "0.21",
       "39" : "0.19"
    }
}

И обновления должны работать так, как они должны работать.Обновив значения.

Я попробовал несколько способов, но не смог обновить так, как хотел.

Метод 1: работает, но неверный результат

MongoCollection<Document> document =  mongoTemplate.getCollection("booksCollection");

BasicDBObject query = new BasicDBObject();
query.put("_id", storeId);

BasicDBObject bookDiscount = new BasicDBObject();
bookDiscount.put(bookId, discount);

BasicDBObject update = new BasicDBObject();
update.put('$push', new BasicDBObject("books", bookDiscount));

document.findOneAndUpdate(query, update);

Метод 1 Вывод:Каждое значение добавляется в новую строку

{
    "_id" : "1664",
    "books" : [ 
        {
            "28" : NumberDecimal("0.75")
        }, 
        {
            "29" : NumberDecimal("0.18")
        }, 
        {
            "30" : NumberDecimal("0.23")
        }, 
        {
            "245" : NumberDecimal("0.26")
        }, 
        {
            "277" : NumberDecimal("0.13")
        }, 
        {
            "270" : NumberDecimal("0.19")
        }
    ]
}

Метод 2: рабочий, но неверный результат

MongoCollection<Document> document =  mongoTemplate.getCollection("booksCollection");

BasicDBObject query = new BasicDBObject();
query.put("_id", storeId);

BasicDBObject bookDiscount = new BasicDBObject();
bookDiscount.put(bookId, discount);

BasicDBObject update = new BasicDBObject();
update.put('$set', new BasicDBObject("books", bookDiscount));

document.findOneAndUpdate(query, update);

Метод 2 Выход: значение всегда заменяется

{
    "_id" : "16644158",
    "locationInfRate" : {
        "2857" : NumberDecimal("0.68")
    },
    "_class" : "com.test.books"
}

1 Ответ

0 голосов
/ 24 мая 2019

Что я выучил:

$push метод выдвигает данные как член списка. $set метод обновляет данные, но для карт он заменяет данные, если карта неправильно отформатирована в запросе.

Я отредактировал свой запрос $set в следующем формате, и он работал:

MongoCollection<Document> document =  mongoTemplate.getCollection("booksCollection");

BasicDBObject query = new BasicDBObject();
query.put("_id", storeId);

BasicDBObject bookDiscount = new BasicDBObject();
bookDiscount.put("books." + bookId, discount);

update.put('$set', bookDiscount);

document.findOneAndUpdate(query, update);
...