【问题标题】:Update / delete multiple objects using Jongo使用 Jongo 更新/删除多个对象
【发布时间】:2014-06-05 04:04:20
【问题描述】:

我有一个方法可以接收要删除的对象集合。

这就是我现在删除它们的方式

public void deleteAll(Collection<Object> objs){
     for(Object obj : objs) {
       collection.remove("{ _id: # }", obj.getId());
     }
}

我正在做一些非常相似的更新,我正在循环通过传递的对象集合。这似乎非常耗时。

有没有更好的更新/删除方法?

【问题讨论】:

  • 虽然我不熟悉这个库中的语法,但基本概念是使用 $in 运算符和列表。因此,如果您可以以某种方式将所有 _id 值“映射”到列表类型中,那么您应该能够使用该运算符作为参数发送。我看到主站点上的Query 示例下有一个关于“查询模板”的部分可能适用于此。
  • 感谢 Neil,这对删除有很大帮助。虽然通过更新,我能够提取出所有需要更新的文档,但我仍然不确定如何一次性保存所有新文档。 Jongo 的 with() 和 save() 方法一次只接受 1 个 Object,不接受 Object 的集合
  • 正如我之前所说,我对 Jongo 没有任何经验,也没有时间尝试一些示例,但如果你有 MongoDB 2.6 或更高版本,那么本手册部分Bulk Update 可能感兴趣。我已经发布了一些关于用法的答案,并且应该有一种方法可以让您至少从 Java 驱动程序获取原始数据库对象,以便使用所需的 runCommand 版本。或者可能是您的 Java 驱动程序公开的其他批量更新 API(如果它是最新版本)。

标签: java mongodb jongo


【解决方案1】:

可以使用单个查询同时删除和更新多个文档。

移除

您需要使用带有$in 的选择器的查询,以及要匹配的_id 值数组。

使用 Jongo,您可以通过几种不同的方式将列表与 $in 匹配到查询中

// pass an array of ids
ObjectId[] ids = {id1, id2, id3};
collection.remove("{ _id: { $in: # } }", ids);

// or pass each id separately
collection.remove("{ _id: { $in:[#, #, #] }}", id1, id2, id3);

更新

与上面使用$in 选择要更新的对象的概念完全相同,但是您还必须设置 multi 选项,以便更新适用于它匹配的所有文档,而不仅仅是第一个。

Jongo 就是这样完成的

ObjectId[] ids = {id1, id2, id3};
collection
  .update("{ _id: { $in: # } }", ids)
  .multi()
  .with({ $set: { foo: "bar" });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-15
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    相关资源
    最近更新 更多