我已经看到其他针对此类问题的话题,但是突出显示的答案都对我无效。
引发错误的代码段是
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; }