当前位置: 首页 > 知识库问答 >
问题:

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

梁楷
2023-03-14

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

html" target="_blank">集合中只有一个文档,并且永远只有一个。当我在命令行上的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
        }
    ]
}

我想在< code >计算列表中添加另一个对象。

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

// Get the database and collection
MongoDatabase database = mongo.getDatabase(dataBaseName);
MongoCollection<Document> collection = database.getCollection(collectionName);
Document document = collection.find().first(); // will only ever be one document 

// The object comes in as a Map
Map<String, Object> incomingMap = new HashMap<>();
incomingMap.put("count", 3);
incomingMap.put("total", 4);
incomingMap.put("mean", 7.9);
// convert to a Document
Document newDocument = new Document();
incomingMap.forEach((k, v) -> {
        newDocument.append(k, v);
});

// append this to the collection - this is where I am confused
// for this example just hardcoding the _id value for simplicity
collection.updateOne(new Document("_id", "1234567890"), Updates.push("calculations", newDocument));

但是,当我在这之后的代码中执行System.out.println(collection.find(). First())或在mongo会话中执行db.collection-name.find.pretty()时,没有添加新文档。没有抛出错误,完成正常。

我想知道的是

  • 行collection.updateOne(new Document(“_id”, “1234567890”), Updates.push(“computings”, newDocument)));正确吗?
  • 它是否已添加但未保存 - 如果是,我该如何保存?
  • 我可以在文档级别执行此操作吗,例如document.update(new Documen(Updates.push(“computings”, newDocument)));或类似?
  • 我也尝试过collection.findAndUpdateOne(new Document(“_id”, “1234567890”), Updates.push(“computings”, newDocument));
  • 我获取/硬编码文档 ID 的方式不正确吗?

共有1个答案

东门佐
2023-03-14

您有过滤条件问题(您的_idObjectId类型)

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

https://api.mongodb.com/java/3.1/com/mongodb/client/result/UpdateResult.html

 类似资料:
  • 问题内容: 我的问题是我想在遍历新元素的同时扩展一个包含新元素的列表,并且希望迭代器继续刚才添加的元素。 根据我的理解,会在列表中的当前元素之前而不是之后添加一个元素。是否可以通过其他方式实现这一目标? 问题答案: 除了以外,您无法在修改集合时使用进行迭代。 但是,如果使用方法,该方法返回,并对其进行迭代,则您还有更多要修改的选项。从javadoc中获取: 新元素插入到隐式光标之前:…后续调用将返

  • 我有一个帐户类,用于我正在构建的求职应用程序,其中包含教育实例的链接列表(只是大学名称,gpa等)。我想要一个HTTP Post请求来向列表中添加一个元素: 这是account类: 然而,当我实际发送带有教育数据的post请求时(针对一个已经存在的用户),它并不发布。它确实正确地打印了帐户a(添加了教育),但实际上并不更新数据库。 此外,这是我拥有的另一个类: 编辑:这是教育课:

  • 问题内容: 我想避免。我该怎么办? 问题答案: 您可以在迭代本身期间使用支持remove / add方法的。

  • 我应该如何编写允许我在数组中添加和删除数组项的补丁方法? 项目类别: 菜单模型: 我有一个菜单组件和一个菜单服务。我需要一个补丁方法,将元素添加到菜单内的ItemClass[]数组中,并能够删除它们。 API方法如下所示: (来自https://stackoverflow.com/a/54679303/479251)

  • 问题内容: 我有一个单击按钮时执行的功能。假设有一个循环将1到10加到。我将该数据添加到中。它完美地工作,并且数字相加。然后我在循环中添加了一个。但是输出是不同的。我想每秒增加1个元素。但是现在它等待10秒,并在第10秒结束时将所有1到10加在一起。我在哪里错了? 问题答案: 您应该在单独的线程中更新列表,否则最终将阻塞事件分发线程。 请尝试以下操作:

  • 问题内容: 这个清单对象在咬我屁股。 每当我尝试向其中添加元素时,它都会产生以下结果: 产生错误的行无关紧要,但无论如何这里都是这样: 我不应该静态访问它吗? 变量的实际声明: 有任何想法吗?在Google上找不到任何值得的东西。 问题答案: Arrays.asList()将给您返回不可修改的列表,这就是为什么添加失败的原因。尝试使用以下方法创建列表: