MongoDB如何从子文档中删除一个子文档?

4
我使用10gen C#驱动程序来操作MongoDB,我想删除一个子文档。但我不知道该如何实现。
以下是一个类似于我的文档的示例:
{
  "_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));

感谢您的帮助。 约翰
1个回答

8
您需要使用$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")); 但是它没有任何作用。 - John
这次,覆盖仍未被移除,但是我在Settings级别上有另一个子文档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]": {}, }, } - John
如果我尝试这个查询:var query = Query.And(Query.EQ("_id", applicationId), Query.EQ("Settings.Key", "ImportDirectory"), Query.EQ("Settings.$.Overrides.Name", "PathDirectory")); 什么也不会发生。 - John
@John Smith:请尝试检查最后的解决方案。 - Andrei Andrushkevich
谢谢Andrei。对我而言,以下语法是可行的。 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语句中缺少"$"符号。 - Jardalu

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