我试图删除单个嵌入式文档,我这样选择和删除
var collection = _database.GetCollection<BsonDocument>("MyCollection");
var builder = Builders<BsonDocument>.Filter;
var filter = builder.Eq("Name", varName)
& builder.Eq("Thing01", varThing01);
& builder.Eq("myembededarray.from", dateFrom)
& builder.Eq("myembededarray.to", dateTo);
var result = collection.DeleteOneAsync(filter).Result;
但它选择并删除整个记录,而不仅仅是嵌入文档。
如果我没有使用C#驱动程序看起来我可以使用$ pull运算符删除嵌入式记录,类似
db.MyCollection.update( { Name: VarName }, { $pull: { myembededarray.from : { $eq: dateFrom },myembededarray.to : { $eq: dateTo } } } )
但我无法弄明白......
如何使用c#这样的$ pull运算符?
解决方案是:
var collection = _database.GetCollection<BsonDocument>("MyCollection");
var builder = Builders<BsonDocument>.Filter;
//find the specific root document
var filter = builder.Eq("Name", varName)
& builder.Eq("Thing01", varThing01);
//create a PullFilter to update the embedded document array
var update = Builders<BsonDocument>.Update.PullFilter("myembededarray",
Builders<BsonDocument>.Filter.Eq("from", dateFrom)
&Builders<BsonDocument>.Filter.Eq("to", dateTo));
//make an update (counter intuitively not a delete)
var result = collection.FindOneAndUpdateAsync(filter, update).Result;