具有查找或匹配的C#MongoDB计数

具有查找或匹配的C#MongoDB计数,c#,mongodb,C#,Mongodb,假设我有两个收藏 User { string Id; string name; } Category { string Id; string userId; string name; } // For Look Up UserJoined : User { public ICOllection<Category> Categories {get;set;} } 用户{ 字符串Id; 字符串名; } 类别{ 字符串Id; 字符串用户标识; 字符

假设我有两个收藏

User {
   string Id;
   string name;
}

Category {
   string Id;
   string userId;
   string name;
}

// For Look Up
UserJoined : User {
   public ICOllection<Category> Categories {get;set;}
}
用户{
字符串Id;
字符串名;
}
类别{
字符串Id;
字符串用户标识;
字符串名;
}
//查找
用户加入:用户{
公共ICOllection类别{get;set;}
}
我正在尝试使用这种查询(SQL)进行计数

expressionquery=p=>p.User.Category.Name==“苹果”;
现在,使用EF-Core在SQL中执行上述操作非常有效

但我想在Mongo DB驱动程序C#中做一些类似的事情

当前的情况是获取所有文档,然后进行计数,从长远来看,这是非常糟糕的性能。我知道可能有什么


我正在查看AddFields operator,但在我的案例中找不到使用它的方法。

这应该可以得到包含名称为“Apple”的类别的用户数:

MongoClient MongoClient=新的MongoClient(“mongodb://localhost:27017");
IMongoDatabase=mongoClient.GetDatabase(“您的数据库名称”);
IMongoCollection usersCollection=db.GetCollection(“用户”);
FilterDefinition matchFilter=Builders.Filter.ElemMatch(“categories”,Builders.Filter.Eq(c=>c[“name”],“Apple”);
AggregateCountResult结果=usersCollection.Aggregate()
.Match(匹配筛选器)
.Count()
.Single();
长计数=结果计数;
这是以下聚合的C#表示:

db.users.aggregate(
[{
$match:{
类别:{
$elemMatch:{
名称:“苹果”
}
}
}
}, {
$count:“count”
}]
)
考虑到您有
用户
收集以下数据:

[
{
“_id”:1,
“名称”:“用户1”,
“类别”:[
{
“_id”:1,
“名称”:“橙色”
},
{
“_id”:2,
“名称”:“苹果”
},
{
“_id”:3,
“名称”:“桃子”
}
]
},
{
“_id”:2,
“名称”:“用户2”,
“类别”:[
{
“_id”:1,
“名称”:“橙色”
},
{
“_id”:3,
“名称”:“桃子”
}
]
},
{
“_id”:3,
“名称”:“用户3”,
“类别”:[
{
“_id”:4,
“名称”:“香蕉”
}
]
},
{
“_id”:4,
“名称”:“用户4”,
“类别”:[
{
“_id”:4,
“名称”:“香蕉”
},
{
“_id”:2,
“名称”:“苹果”
}
]
},
{
“_id”:5,
“名称”:“用户5”,
“类别”:[
{
“_id”:2,
“名称”:“苹果”
}
]
}
]

count
变量的值将为3。

这应获得包含名称为“Apple”的类别的用户计数:

MongoClient MongoClient=新的MongoClient(“mongodb://localhost:27017");
IMongoDatabase=mongoClient.GetDatabase(“您的数据库名称”);
IMongoCollection usersCollection=db.GetCollection(“用户”);
FilterDefinition matchFilter=Builders.Filter.ElemMatch(“categories”,Builders.Filter.Eq(c=>c[“name”],“Apple”);
AggregateCountResult结果=usersCollection.Aggregate()
.Match(匹配筛选器)
.Count()
.Single();
长计数=结果计数;
这是以下聚合的C#表示:

db.users.aggregate(
[{
$match:{
类别:{
$elemMatch:{
名称:“苹果”
}
}
}
}, {
$count:“count”
}]
)
考虑到您有
用户
收集以下数据:

[
{
“_id”:1,
“名称”:“用户1”,
“类别”:[
{
“_id”:1,
“名称”:“橙色”
},
{
“_id”:2,
“名称”:“苹果”
},
{
“_id”:3,
“名称”:“桃子”
}
]
},
{
“_id”:2,
“名称”:“用户2”,
“类别”:[
{
“_id”:1,
“名称”:“橙色”
},
{
“_id”:3,
“名称”:“桃子”
}
]
},
{
“_id”:3,
“名称”:“用户3”,
“类别”:[
{
“_id”:4,
“名称”:“香蕉”
}
]
},
{
“_id”:4,
“名称”:“用户4”,
“类别”:[
{
“_id”:4,
“名称”:“香蕉”
},
{
“_id”:2,
“名称”:“苹果”
}
]
},
{
“_id”:5,
“名称”:“用户5”,
“类别”:[
{
“_id”:2,
“名称”:“苹果”
}
]
}
]

count
变量的值将为3。

如果目标是获得将“Apple”作为一个类别的用户数,您可以这样做:

var appleUserCount=await categoryCollection.CountDocumentsAsync(c=>c.Name==“Apple”);
但是,如果存在重复的类别(相同的userId和categoryName),那么获得准确的计数就有点复杂,您必须进行一些分组以获得不同的用户计数

测试程序:

使用MongoDB.Entities;
使用System.Threading.Tasks;
命名空间测试应用程序
{
公共类用户:实体
{
公共字符串名称{get;set;}
}
公共类类别:实体
{
公共字符串用户标识{get;set;}
公共字符串名称{get;set;}
}
公共静态类程序
{
专用静态异步任务Main()
{
等待DB.InitAsync(“测试”);
等待DB.Index()
.Key(c=>c.Name,KeyType.升序)
.CreateAsync();
var user1=新用户{Name=“Fanboy”};
var user2=新用户{Name=“Poolboy”};
等待新的[]{user1,user2}.SaveAsync();
等待新的[]{
新类别{Name=“Apple”,UserID=user1.ID},
新类别{Name=“Apple”,UserID=user2.ID},
新类别{Name=“Google”,UserID=user1.ID}
}.SaveAsync();
var计数
Expression<Func<User,bool>> query = p => p.User.Category.Name == "Apple";