我目前正在使用MongoDB的C驱动程序,一个接一个地尝试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对象完好无损。
有人能帮我指出我的代码哪里出错了吗?
任何建议都非常感谢,谢谢。

最佳答案

要使$pullAll起作用,您必须精确匹配整个对象,并且不能只使用一个字段(即使它被称为“id”)。
因此,在update命令中还必须包含名称(而且字段的顺序也必须相同)。
您真正想使用的命令是$pull,它可以满足您的需要,即匹配筛选条件:
除了匹配精确值外,还可以使用表达式($pull is special in this way)。
尽管它被称为“拉而不全”,但它确实拉所有匹配的元素,而不仅仅是一个。“all”只意味着您有一个过滤器(而pullall有多个元素要匹配)。

关于c# - MongoDB C#:Update.pullAll不删除项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10310837/

10-08 22:09