c# - C#中的MongoDb计数子数组元素返回所有时间0
问题描述
我的 MongoDb 数据库中有一个文档,我想编写一个查询来检索数组大小大于 0 的文档(数组不为空或为空以清除)。
这是我的 C# 代码,因为这Quotes
是我的子数组:
internal bool HasQuote(string projectNumber)
{
var filter = Builders<Entity.Project>.Filter.Eq(x => x.ProjectNumber, projectNumber);
filter &= Builders<Entity.Project>.Filter.Exists(x => x.Quotes);
filter &= Builders<Entity.Project>.Filter.SizeGt(x => x.Quotes.Count, 0);
var res = _mongoCollection.CountDocuments(filter);
return res > 0;
}
不幸的是,该函数一直返回false
。它必须与SizeGt
零件有关,因为当我删除此行时,它工作正常。我尝试了其他的东西,比如filter &= Builders<Entity.Project>.Filter.Where(x => x.Quotes.Count > 0);
或filter &= Builders<Entity.Project>.Filter.Exists(x => x.Quotes[0]);
解决方案
SizeGT 接受什么作为参数?
SizeGt(FieldDefinition<TDocument> field, int size);
这意味着您必须提供一个需要依靠的字段。
如何修复您的代码
换行:
filter &= Builders<Entity.Project>.Filter.SizeGt(x => x.Quotes.Count, 0);
对此
filter &= Builders<Entity.Project>.Filter.SizeGt(x => x.Quotes, 0);
您不提供计数的原因是因为 SizeGT 知道如何转换 x.Quotes 并对其进行计数。如果您进行计数并捕获错误,您将收到错误:
无法确定 x => Convert(x.Quotes.Count) 的序列化信息。
我刚刚在我的列表中运行了上面的代码,它返回了正确的数字。