Mat*_*per 5 .net c# mongodb mongodb-query .net-core
我已经看到其他针对此类问题的话题,但是突出显示的答案都对我无效。
引发错误的代码段是这样的
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();
Run Code Online (Sandbox Code Playgroud)
原始代码是这样的:
List<Distribution> distributionPublishQueueList =
(await mongoDb.GetCollection<Distribution>()
.FindAsync(x => x.Status == EntityStatus.Ok
&& x.IsActive
&& distinctDistributionIdInPublishQueueList.Contains(x.Id)))
.ToList();
Run Code Online (Sandbox Code Playgroud)
但是我试图使它对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();
Run Code Online (Sandbox Code Playgroud)
由于数据库中存在的分发数量,我需要不能在本地内存中执行此操作。是否有使用“包含”和“任何”的解决方法。我还尝试过使用MongoCSharpDriver In语句和Builders.Filter.In及其它变体。
错误示例如下。这是使用的代码。
List<Asset> assetList = (await mongoDb.GetCollection<Asset>().FindAsync(
asset => extractAssetsFromContentService.ExtractAssetFromDraftContent(contentAsMarkdown)
.Any(extractedAsset => extractedAsset.AssetId == asset.Id))).ToList();
Run Code Online (Sandbox Code Playgroud)
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; }
Run Code Online (Sandbox Code Playgroud)
您可以使用以下任一解决方案;
var filter = Builders<Distribution>.Filter.ElemMatch(x => x.Distincts, i => distinctIdList.Contains(i.Id));
var results = await (await _collection.FindAsync(filter)).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
或者
Expression<Func<Distribution, bool>> filter = x => districtIdList.Contains(x.Id);
var results = await (await _collection.FindAsync(filter)).ToListAsync();
Run Code Online (Sandbox Code Playgroud)
这两个解决方案在我的项目中运行良好。我有一个库,您可以在其中应用这些用法。expression当您向此处的任何方法发送时get,它都会起作用。例如;
var distributionPublishQueueList = await _distributionRepository.GetAllAsync(x => distinctDistributionIdInPublishQueueList.Contains(x.Id));
Run Code Online (Sandbox Code Playgroud)
您可以从此处查看文档。
| 归档时间: |
|
| 查看次数: |
639 次 |
| 最近记录: |