我有一个看起来像这样的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);
我正在尝试使用'drop'方法从'Order'等于54321的数组中删除整个文档,但由于某种原因它不起作用,我可能做错了。有人可以指出这个问题吗?
此外,在数组中保留文档计数的最佳方法是什么,以便在拉出所有文档后从数据库中删除整个文档?添加某种“大小”属性并跟踪大小并在每次拉动后减少它会不会很好?
答案 0 :(得分:1)
要从任何文档中删除内部数组中Order=54321
的文档(如果您不知道ID
),可以使用空过滤器,如:
Document filter = new Document();
Document update = new Document("$pull", new Document("ObjData", new Document("Order", "54321")));
coll.updateOne(filter, update);
答案 1 :(得分:0)
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中创建数组大小的索引。
updateOne
documentation用于使用Java驱动程序更新文档deleteOne
documentation用于使用Java驱动程序删除文档$pull
documentation用于从数组中删除文档$size
documentation用于根据数组大小过滤文档