首页 > 解决方案 > 使用 Any() 或 Contains() 时 mongo Db 不支持过滤器类型 - 是否有任何解决方法/修复?

问题描述

我已经看到此类问题的其他主题,但没有一个突出显示的答案对我有用。

引发错误的代码是这样的

List<Distribution> distributionPublishQueueList = (mongoDb.GetCollection<Distribution>().Find(Builders<Distribution>.Filter.And(
            Builders<Distribution>.Filter.Where(x => x.Status == EntityStatus.Ok),
            Builders<Distribution>.Filter.Where(x => x.IsActive),
            Builders<Distribution>.Filter.Where(x => distinctDistributionIdInPublishQueueList.Contains(x.Id))))).ToList();

原来的代码是这样的:

List<Distribution> distributionPublishQueueList = 
   (await mongoDb.GetCollection<Distribution>()
       .FindAsync(x => x.Status == EntityStatus.Ok 
                    && x.IsActive
                    && distinctDistributionIdInPublishQueueList.Contains(x.Id)))
      .ToList();

但我试图让它对 mongo 更友好。上面的两段代码都是一样的。列表 distinctDistributionIdInPublishQueueList 是分布 Id 的列表,它们是字符串。所以我试图找到ID在该列表+其他2个过滤器内的所有分布。当我在过滤器定义中使用 contains 时,它会引发不支持的过滤器异常。但是以下代码有效,因为我将列表放入本地内存并对其使用 LINQ:

List<Distribution> distributionPublishQueueList = (await mongoDb.GetCollection<Distribution>().FindAsync(x => x.Status == EntityStatus.Ok && x.IsActive)).ToList();
distributionPublishQueueList = distributionPublishQueueList.Where(x => distinctDistributionIdInPublishQueueList.Contains(x.Id)).ToList();

由于数据库中存在大量分布,我需要能够不在本地内存中执行此操作。是否有使用 Contains 和 Any 的解决方法。我也尝试过使用 MongoCSharpDriver In 语句和 Builders.Filter.In 和其他变体。

示例错误如下。这是使用的代码。

List<Asset> assetList = (await mongoDb.GetCollection<Asset>().FindAsync(
asset => extractAssetsFromContentService.ExtractAssetFromDraftContent(contentAsMarkdown)
.Any(extractedAsset => extractedAsset.AssetId == asset.Id))).ToList();

System.ArgumentException:不支持的过滤器:Any(value(System.Collections.Generic.List`1[DocWorks.Common.Transformation.Model.ExtractedAssetModel]).Where(({document}{AssetId} == {document}{_id} )))。

这将是相同的错误,除了在使用包含而不是任何时任何将是“包含”。与分发类似,我无法将资产带入本地内存。所有实体共享相同的基类,该基类存储 Id,如下所示:

 [BsonRepresentation(BsonType.ObjectId)]
 public string Id { get; set; }

标签: c#.netmongodb.net-coremongodb-query

解决方案


推荐阅读