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

时间:2018-11-20 16:52:05

标签: c# .net mongodb .net-core mongodb-query

我已经看到其他针​​对此类问题的话题,但是突出显示的答案都对我无效。

引发错误的代码段是

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();

由于数据库中存在大量分发,因此我必须不能在本地内存中执行此操作。是否有使用“包含”和“任何”的解决方法。我还尝试过使用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}))。

这将是相同的错误,除了使用“ contains”而不是“ any”时“ Any”为“ Contains”。与分发类似,我无法将资产带入本地内存。所有实体共享一个相同的基类,该基类存储ID如下:

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

0 个答案:

没有答案