MongoDB C#:Update.pullAll 不删除项目

本文关键字:删除项目 pullAll Update MongoDB | 更新日期: 2023-09-27 18:32:14

我目前正在使用其C#驱动程序使用MongoDB,一一尝试API中的每个方法(如果他们提供一些示例会更好)。

目前我正在使用Update.PullAll()方法。

我正在使用此 POCO 对象进行测试:

public class Person 
{
    public ObjectId Id { get; set; }
    public string Firstname { get; set; }
    public string Lastname { get; set; }
    public List<Skill> Skills { get; set; }
}
public class Skill 
{
    public Object Id { get; set; }
    public string Name { get; set; }
}


如果填充,则转换为以下 json 对象:

{
   "_id": ObjectId("4f979621682dbc1a8cefecb3"),
   "Firstname" : "John",
   "Lastname" : "Doe",
   "Skills" : [
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecaf"),
          "Name" : "C#.NET"
       },
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecb0"),
          "Name" : "ASP.NET"
       },
       {
          "_id" : ObjectId("4f979621682dbc1a8cefecb1"),
          "Name" : "SQL Server"
       }
   ]
}

现在,我正在尝试从技能集合中删除元素。

这是我的代码:

var server = MongoServer.Create("mongodb://localhost/?safe=true");
var db =  server.GetDatabase("test");
var collection = db.GetCollection<Person>("person");
// Retrieve the data above from  mongoDB
var _person = collection.AsQueryable()
                        .Select(p => p).Single();
// Query to reference "John Doe"
var query = Query.EQ("_id",new ObjectId(_person.Id.ToString()));
// Collection of "John Doe's" skill ids
var objIds = _person.Skills
                    .Select(p => new ObjectId(p.Id.ToString()));
// Parse the skill ids to a BsonArray
var bsonArray = BsonArray.Create(objIds);
var update = Update.PullAll("Skills" , bsonArray);
// Call the Update command
collection.Update( query, update );

什么都不做;它让我的 json 对象完好无损。

谁能帮我指出我的代码哪里出了问题?
任何建议都非常感谢,谢谢。

MongoDB C#:Update.pullAll 不删除项目

要使$pullAll工作,您必须完全匹配整个对象,并且不能只使用一个字段(即使它被称为_id)。

因此,您还必须在更新命令中包含名称(并且字段也需要按相同的顺序排列)。

您真正想使用的命令是 $pull ,它执行您在此处需要的操作,即匹配过滤条件:

除了匹配精确值之外,您还可以使用表达式($pull这种方式很特殊)。

尽管它被称为"拉而不拉",但它确实拉动了所有匹配的元素,而不仅仅是一个。"all"只是意味着你有一个过滤器(而pullAll有多个元素要匹配)。