我目前正在使用其C#驱动程序使用MongoDB,尝试API 中的每个方法(如果他们提供一些示例,这将是联盟更好)逐个。< / p>
目前我正在使用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对象完好无损。
任何人都可以帮我指出我的代码在哪里出错了吗? 非常感谢任何建议,谢谢。
答案 0 :(得分:3)
要使$pullAll
正常工作,您必须完全匹配整个对象,并且不能只使用一个字段(即使它被称为_id)。
因此,您必须在更新命令中包含该名称(并且字段也需要以相同的顺序)。
您真正想要使用的命令是$pull
,它可以满足您的需求,即匹配过滤条件:
除了匹配精确值之外,您还可以使用表达式($pull is special in this way)。
即使它被称为“没有全部拉动”,它确实拉所有匹配的元素,而不仅仅是一个。 “all”只意味着你有一个过滤器(而pullAll有多个要匹配的元素)。