首页 > 解决方案 > 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]);

标签: c#mongodb

解决方案


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) 的序列化信息。

我刚刚在我的列表中运行了上面的代码,它返回了正确的数字。


推荐阅读