【问题标题】:MongoDB remove a subdocument document from a subdocumentMongoDB 从子文档中删除子文档文档
【发布时间】:2023-03-28 20:45:01
【问题描述】:

我使用 MongoDB 的 10gen C# 驱动程序,我想从子文档中删除一个子文档。我不知道该怎么做。

这是一个看起来像我的文档的示例

{
  "_id": "binary_stuff",
  "Name": "MyApplication",
  "Settings": [
    {
      "_id": "binary_stuff",
      "Key": "ImportDirectory",
      "Value": "C:\data",
      "Overrides": [{
             "_id": "binary_stuff",
             "Name": "PathDirectory",
             "Value": "C:\anotherData"
       }]
    },
}

我想删除名称为 PathDirectory 的覆盖。这是我写的查询,但它不起作用。我没有错误。

var query = Query.And(Query.EQ("_id", applicationId), Query.EQ("Settings.Key", "ImportDirectory"), Query.EQ("Settings.$.Overrides.Name", "PathDirectory"));
Run(database => database.Applications().Remove(query));

感谢您的帮助。 约翰

【问题讨论】:

    标签: c# mongodb


    【解决方案1】:

    您应该使用 $pull 操作从数组中删除项目。

            var query = Query.And(Query.EQ("_id", applicationId),
                             Query.EQ("Settings.Key",  "ImportDirectory"));
            var update = Update.Pull("Settings.$.Overrides", new BsonDocument(){
                { "Name", "PathDirectory" }
            });
            database.Applications().Update(query, update);
    

    【讨论】:

    • 我用你的代码尝试了这个查询: var query = Query.And(Query.EQ("_id", applicationId), Query.EQ("Settings.Key", "ImportDirectory")) ;但它什么也没做
    • 这一次,覆盖仍然没有被删除,而是我在设置级别有另一个子文档 Settings[0]: {}。看这个文件: { "_id": "binary_stuff", "Name": "MyApplication", "Settings": [ { "_id": "binary_stuff", "Key": "ImportDirectory", "Value": "C: \data", "Overrides": [{ "_id": "binary_stuff", "Name": "PathDirectory", "Value": "C:\anotherData" }], "Settings[0]": {}, } , }
    • 如果我尝试这个查询: var query = Query.And(Query.EQ("_id", applicationId), Query.EQ("Settings.Key", "ImportDirectory"), Query。 EQ("Settings.$.Overrides.Name", "PathDirectory"));什么都没有发生
    • @John Smith:请尝试检查最后的解决方案
    • 谢谢安德烈。对我来说,以下语法有效。 var query = Query.And(Query.EQ("_id", applicationId), Query.EQ("Settings.Key", "ImportDirectory")); var update = Update.Pull("Settings.Overrides", new BsonDocument(){ { "Name", "PathDirectory" } }); database.Applications().Update(query, update);。请注意,pull 语句中缺少“$”符号。
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 2016-02-01
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多