c# mongodb 从多个文档中选择的数组中查找并删除一个元素

c# mongodb Find and remove one element from an array selected among several documents

总的来说,我是 document-oriented database 方面的新手,尤其是 MongoDB 方面的新手。

这个数据库是我创建的:几个包含整数的不相交段的集合。

我想根据某些条件取一个项目并将其从文档中删除。

比如我试过带条件的物品:

  1. 从[-105; 17]
  2. 不为零
  3. 包含在 {-104、-97、-5、0、5}

像这样

var db          = client.GetDatabase("mongodbPOC");
var collection  = db.GetCollection<Document>("Int");
var contains    = new List<int> { -104, -97, -5, 0, 5 };
var result      = collection.AsQueryable()
                            .Where(document => 17 >= document.Min && -105 <= document.Max)
                            .SelectMany(document => document.Values)
                            .First(val => val != 0 && contains.Contains(val));

并再次找到它以进行删除,但我确信存在一种更有利可图的方法。

要从 MongoDb 中的数组中删除项目,您需要使用 PullPullFilter,在您的情况下,您需要使用 PullFilter,如下所示:

var filterPull = Builders<int>.Filter
                              .Where(x => x != 0 && contains.Contains(x));
var update = Builders<YourModel>.Update
                                .PullFilter(c => c.Values, filterPull);

然后为 Min、Max 条件创建另一个过滤器,此过滤器适用于您的文档并使用 Update Collection:

var filter = Builders<YourModel>.Filter
                                .Where(document => 17 >= document.Min && -105 <= document.Max);
Collection.UpdateManyAsync(filter, update);

对于删除,找到解决方案并不容易,但他们在 slackMongoDB 论坛上帮助了我。解决这个问题有两种方法:

  1. 4.2 中使用 agg expressions 获取位置已知或未知的值(Asya 的回答):https://jira.mongodb.org/browse/SERVER-1014?focusedCommentId=2305681&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-2305681
  2. 使用 $unset 然后 $pullAll 删除所有 null