从MongoDB Java中的数组中移除文档

3

我收到了一个类似于以下JSON字符串:

String tmp = "[
   {
      "ID":"12",
      "Date":"2018-02-02",
      "ObjData":[
         {
            "Name":"AAA",
            "Order":"12345",
            "Extra1":{
               "Temp":"3"
            },
            "Extra2":{
               "Temp":"5"
            }
         },
         {
            "Name":"BBB",
            "Order":"54321",
            "Extra1":{
               "Temp":"3"
            },
            "Extra2":{
               "Temp":"5"
            }
         }
      ]
   }
]"

我想要从´ObjData´中删除"Order"等于"54321"的文档。我有以下代码:
Document doc = new Document();
doc = Document.parse(tmp);

Document fields = new Document("ID", "12")
    .append("ObjData", Arrays.asList(new Document("Order", "54321")));

Document update = new Document("$pull", fields);

coll.updateOne(doc, update);

我正在尝试使用“拉取”方法,将“订单”等于54321的整个文档从数组中移除,但出现了问题,可能是我做错了什么。能否请有经验的人指点一下问题所在?
另外,最好的方法是什么,以便计算数组中的文档总数,这样一旦所有文档都被拉出,整个文档就会从数据库中删除?是否应该添加某种“大小”属性并跟踪大小,在每次拉出后减少它?
2个回答

1

更新记录以从ObjData数组中删除值

updateOne方法的第一个参数是用于查找要更新的文档的查询条件,而不是完整的文档。

因此,对于您的代码,假设ID是唯一的值,并且在集合中有一个具有ID"12"的项:

// { ID: "12" }
Document query = new Document("ID", "12");

// { ObjData: { $pull: { Order: "54321" } } }
Document update = new Document("ObjData",
        new Document("$pull",
                new Document("Order", "54321")
        )
);

coll.updateOne(query, update);

如果你想从数据库中删除所有文档的顺序,只需将 query 替换为一个空的 Document,即:

// { <empty> }
Document query = new Document();

删除空的ObjData数组记录

当大小为零时,您可以使用带有$size的过滤器来删除记录:

db.myColl.deleteMany({ ObjData: { $size: 0 } })

这也可以使用Java驱动程序完成:

// { ObjData: { $size: 0 } }
Document query = new Document("ObjData",
        new Document("$size", 0)
);
coll.deleteMany(query);

请注意,对于大型集合(即myColl较大,而不是ObjData数组),这种方法可能表现不佳。如果是这种情况,则您可能希望单独跟踪大小(正如您在问题中暗示的那样)并对其进行索引以使其更快地搜索,因为在MongoDB中无法创建数组大小索引。

参考资料


1
要从任何文档中删除内部数组中Order=54321的文档(如果您不知道ID),可以使用空过滤器,例如:
    Document filter = new Document();
    Document update = new Document("$pull", new Document("ObjData", new Document("Order", "54321")));

    coll.updateOne(filter, update);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接