我想删除mongoDb中的一个子文档,但是不能成功。我尝试了$update,$push和$pull,但是没有成功。
我有以下文档。
db.users.findOne({"_id": ObjectId("545677a9e4b0e0ef9379993c")})
{
"_class" : "com.xxx.xxx.server.da.User",
"_id" : ObjectId("545677a9e4b0e0ef9379993c"),
"bookSummaries" : [
{
"_id" : ObjectId("545677e7e4b0e0ef9379993d"),
"isbn" : "2746969644"
"title": "test title"
},
{
"_id" : ObjectId("546a522a44ae4f5e652fdca7"),
"loanSummaries" : [
{
"loanStatus" : "REQUESTED",
"loanId" : "5473992044aec466a619290c"
},
{
"loanStatus" : "REQUESTED",
"loanId" : "5473997d44aec466a619290d"
},
{
"loanStatus" : "REQUESTED",
"loanId" : "547605a744ae0f0d558ae757"
}
],
"testArray" : [
{
"title" : "Back to the future",
"id" : "test"
},
{
"title" : "Back to the future",
"id" : "test2"
},
{
"title" : "Back to the future",
"id" : "test3"
},
"test ",
"test ",
"test 2",
"test 2",
{
"loanStatus" : "REQUESTED"
}
],
"title" : "Back to the future"
}
]
}
我试图创建查询:
你能帮我创建这些查询吗?我看到好几个类似的帖子,但不是同一个问题。
谢谢你的帮助
我最近遇到了同样的问题,我不得不删除一个嵌套的子数组。在查询中,你需要确定你要删除的确切对象,然后在更新查询中你可以使用 $
符号作为要拉取的数组中对象的索引。
var query = {
"_id" : ObjectId(someUserId),
"bookSummaries._id" : ObjectId(bookId), //might also work with isbn as long as it is uniq
"bookSummaries.loanSummaries.loanId" : loanId
};
var updateQuery = {
"$pull" : {
"bookSummaries.$.loanSummaries" : {
"loanId": loadId
}
}
}
我在我的shell中尝试了以下查询,效果不错。你必须输入appropirate ids。
var query = { "_id" : ObjectId("53b73b1108fe927c0e00007f"), "bookSummaries._id" : ObjectId("53b73b1108fe927c0e00007f"), "bookSummaries.loanSummaries.loanId" : "53b73b1108fe927c0e00007f" }
var updateQuery = { "$pull" : { "bookSummaries.$.loanSummaries" : { "loanId": "53b73b1108fe927c0e00007f" } } }
如果你已经知道你要删除的 itemobject 的索引,你可以使用下面的查询来实现。
找到你要编辑的文档
var query = {
"_id" : ObjectId(someUserId),
};
取消设置您要删除的对象
var update1 = {
"$unset" : {
"bookSummaries.1.loanSummaries.2" : 1
}
}
拉出值为null的对象。
var update2 = {
"$pull" : {
"bookSummaries.1.loanSummaries" : null
}
}
而要删除基本上可以使用同样的查询。
找到你要编辑的文档
var query = {
"_id" : ObjectId(someUserId),
};
取消设置您要删除的对象
var update1 = {
"$unset" : {
"bookSummaries.0.testArray" : 1
}
}
因为MongoDB提供了一个完整的JavaScript环境,你可以很容易地对文档进行操作,并将数据保存回db。
*注:如果你是用php或python等来使用MongoDB的话,也有相应的方法。
1.删除整个 "testArray "子文档,只删除这个特定的子文档,例如index(1) do
db.users.find({"_id": ObjectId("545677a9e4b0e0ef9379993c")}).forEach(function (user) {
delete user.bookSummaries[1].testArray;
//Saveing the changes
db.users.save(user);
});
要删除一个特定的贷款摘要,给出这个特定子文档的贷款ID,例如id 5473992044aec466a619290c,做
db.users.find({"_id": ObjectId("545677a9e4b0e0ef9379993c")}).forEach(function (user) {
var loanToDelete = "5473992044aec466a619290c";
var loanIndexToDelete = -1;
var i;
for(i in user.bookSummaries[1].loanSummaries) {
if(user.bookSummaries[1].loanSummaries[i].loanId === loanToDelete) {
loanIndexToDelete = i;
break;
}
}
if (loanIndexToDelete > -1) {
delete user.bookSummaries[1].loanSummaries[loanIndexToDelete];
}
//Saving the changes
db.users.save(users);
});
我不得不做类似的事情,但删除多个子文档,而不是只删除一个。我的查询包括一个id数组,这对我来说是有效的。
User.updateOne(
{ _id: userId },
{
$pull: { bookSummaries: { _id: { $in: ids } } },
});