计算嵌入式文档 mongodb c# LINQ

Count embedded documents mongodb c# LINQ

您好,我正在尝试使用 LINQ 对数组中的文档进行计数。

我的结构很简单。这是一个简化的 Bson 示例。

{
"_id" : ObjectId("56fa945dbf0c37096048109f"),
"Commands" : [ 
    {

        "CommandId" : ObjectId("56fbdc24bf0c372078f10227"),
    }, 
    {
        "CommandId" : ObjectId("56fbdc28bf0c372078f1022b"),      
    }, 
    {
        "CommandId" : ObjectId("570b6863bf0c370838473321"),
    }
]

}

这是我到目前为止想出的,但它只说我有 1 个命令。

    var result =
                     (from e in collection.AsQueryable<Sequence>()
                     where e._id == seqid
                     select e.Commands).Count();               
                Console.WriteLine("There where " + result + " Commands");

有什么想法吗?

我想出了一个解决方案,不确定它是否是最好的,但它确实有效。

            var result = (from p in collection.AsQueryable().Where(p => p._id == seqid)
                 from cmds in p.Commands
                 select cmds).Count();
            Console.WriteLine("There where " + result + " Commands");

我建议为此使用聚合框架和 $size - 这将避免将数组本身传输到客户端。

例如:

var result = collection.Aggregate().Match(x => x.Id == seqid)
    .Project(new BsonDocument("count", new BsonDocument("$size", "$Commands")))
    .FirstOrDefault()
    .GetValue("count").ToInt32();

Console.WriteLine("There were " + result + " Commands");

您可以在此处阅读有关 $size 的更多信息: https://docs.mongodb.org/manual/reference/operator/aggregation/size/

LINQ 查询始终转换为聚合框架管道

> var pipeline = [
... { "$group" : { "_id" : 1, "__result" : { "$sum" : 1 } } }
... ]
> db.test.aggregate(pipeline)

使用带过滤的简单计数方法