使用Java向MongoDB文档中的列表添加元素

使用Java向MongoDB文档中的列表添加元素,java,mongodb,Java,Mongodb,对于如何在现有mongodb文档中向数组添加元素,或者为什么我的结果没有正确显示,以及我期望的结果如何,我有点困惑 集合中只有一个文档,并且将永远只有一个文档。当我在命令行上的mongo会话中执行db.collection name.find.pretty()命令时,mongo文档看起来像: { "_id" : ObjectID("1234567890"), "details" : { ... }, "calculations" : [

对于如何在现有mongodb文档中向数组添加元素,或者为什么我的结果没有正确显示,以及我期望的结果如何,我有点困惑

集合中只有一个文档,并且将永远只有一个文档。当我在命令行上的mongo会话中执行
db.collection name.find.pretty()
命令时,mongo文档看起来像:

{
    "_id" : ObjectID("1234567890"),
    "details" : {
        ...
    },
    "calculations" : [
        {
            "count" : 1,
            "total" : 10,
            "mean" : 2.5
        },
        {
            "count" : 2,
            "total" : 20,
            "mean" : 6.4
        }
    ]
}

我想在
计算
列表中添加另一个对象

我运行的Java代码基于以下示例:

//获取数据库和集合
MongoDatabase database=mongo.getDatabase(dataBaseName);
MongoCollection collection=database.getCollection(collectionName);
Document Document=collection.find().first();//将永远只有一个文档
//该对象以贴图的形式出现
Map incomingMap=newhashmap();
收入图。投入(“计数”,3);
收入图。投入(“总计”,4);
收入图。投入(“平均值”,7.9);
//转换成文件
Document newDocument=新文档();
收益图forEach((k,v)->{
新增文档。追加(k,v);
});
//将此附加到集合中-这是我感到困惑的地方
//对于本例,为了简单起见,只需对_id值进行硬编码
collection.updateOne(新文档(“_id”,“1234567890”),Updates.push(“计算”,新文档));
但是,当我在此之后的代码中执行
System.out.println(collection.find().first())
或在mongo会话中执行
db.collection name.find.pretty()
时,新文档尚未添加。没有抛出任何错误,完成得很好

我想知道的是

  • 是行
    collection.updateOne(newDocument(“_id”,“1234567890”),Updates.push(“calculations”,newDocument))正确吗
  • 是否已添加但未保存?如果是,如何保存
  • 我是否可以在文档级别执行此操作,例如
    document.update(new Documen(Updates.push(“计算”,newDocument));
    或类似操作
  • 我还尝试了
    collection.findAndUpdateOne(新文档(“\u id”,“1234567890”)、Updates.push(“计算”,新文档));
    ,得到了相同的结果
  • 我获取/硬编码文档ID的方式是否不正确

    • 您有过滤条件问题(您的
      \u id
      ObjectId
      类型)

      始终确保文档更新正确。查看代码片段:

      UpdateResult result = collection.updateOne(filter, update);
      log.info("Update with date Status : " + result.wasAcknowledged());
      log.info("Nº of Record Modified : "   + result.getModifiedCount());
      

      因此,我添加了一种获取文档ID的方法,而不是硬编码,它可以工作?!我的ID值中有一个输入错误,或者删除了调试时使用的打印语句,都可以工作。如果有人能确认我所做的是正确的,那就好了,这样我就可以将其标记为已回答!
      new Document("_id", ObjectId("1234567890"))`
      
      UpdateResult result = collection.updateOne(filter, update);
      log.info("Update with date Status : " + result.wasAcknowledged());
      log.info("Nº of Record Modified : "   + result.getModifiedCount());