MongoDb使用过滤器匹配列表

时间:2019-03-29 12:06:51

标签: c# mongodb mongodb-.net-driver intersection

我有一个BsonDocument的列表:

   var list = db.GetCollection<BsonDocument>(collectionName); 
   var myIds = list.Find(_ => true)
    .Project(Builders<BsonDocument>.Projection.Include("_id"))
    .ToList();

其中包含:

myIds = "{ 
{ "_id" : "cc9d9282-c9d2-4cba-a776-ffddsds274d5" },  
{ "_id" : "2c1ddd82-c9d2-4dda-afr6-d79ff1274d56" },  
{ "_id" : "ss969281-c9d2-4cba-a776-d79ffds274d5" }  
}"

并想这样查询:

var deleted =list.DeleteMany(Builders<MessageExchange>.Filter.In("_id", myIds));

我也尝试了以下方法:

var filter = new BsonDocument("_id", new BsonDocument("$in", new BsonArray(myIds)));
var deleted = list.DeleteMany(filter);

返回属性DeletedCount = 0 有人可以指出过滤器似乎有什么问题吗?

2 个答案:

答案 0 :(得分:3)

您必须像这样从BsonDocument中提取 _id

var extractedIds = myIds.Select(x => x["_id"].ToString()).ToList();

之后,您可以在过滤器中使用它。

list.DeleteMany(Builders<MessageExchange>.Filter.In("_id", extractedIds));

确保过滤器的 _id 部分与MessageExchange类的部分匹配

另一种方法是使它成为强类型:

list.DeleteMany(Builders<MessageExchange>.Filter.In(x => x.Id, extractedIds));

答案 1 :(得分:0)

这也很好(根据Skami的回答):

var filter = new BsonDocument("_id", new BsonDocument("$in", new BsonArray(extractedIds)));
list.DeleteMany(filter);

因此与MessageExchange类无关。