【问题标题】:Mongo Template's findAndModify is returning null values for adding or updating nested elementsMongo 模板的 findAndModify 返回空值以添加或更新嵌套元素
【发布时间】:2023-03-08 23:19:02
【问题描述】:

我的数据格式为:

{
    "_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);

Method1 输出:每个值都添加到新行中

{
    "_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"
}

【问题讨论】:

    标签: java mongodb mongo-java mongo-java-driver


    【解决方案1】:

    我学到了什么:

    $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);
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 2020-07-08
    • 2014-08-28
    • 1970-01-01
    相关资源
    最近更新 更多