蒙古包删除子文档

问题描述 投票:2回答:3

我想删除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"
        }
    ]
}

我试图创建查询:

  1. 删除整个 "testArray "子文档,只删除这个特定的子文档。
  2. 删除一个特定的贷款摘要给这个特定的子文档的贷款ID

你能帮我创建这些查询吗?我看到好几个类似的帖子,但不是同一个问题。

谢谢你的帮助

javascript mongodb spring-data-mongodb
3个回答
2
投票

我最近遇到了同样的问题,我不得不删除一个嵌套的子数组。在查询中,你需要确定你要删除的确切对象,然后在更新查询中你可以使用 $ 符号作为要拉取的数组中对象的索引。

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"  } } }

更新2

如果你已经知道你要删除的 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
  }
} 

0
投票

因为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);
 });
  1. 要删除一个特定的贷款摘要,给出这个特定子文档的贷款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);
    });
    

0
投票

我不得不做类似的事情,但删除多个子文档,而不是只删除一个。我的查询包括一个id数组,这对我来说是有效的。

User.updateOne(
      { _id: userId },
      {
        $pull: { bookSummaries: { _id: { $in: ids } } },
      });
© www.soinside.com 2019 - 2024. All rights reserved.