我有一个(对我来说)非常复杂的 mongo 查询,如下所示:
public void GetData(ObjectId projectId, IList<ObjectId> users)
{
var query = @"
db.getCollection("users").aggregate([
{
$match: {
projectId: projectId,
userId: { $in: [...users] },
},
},
{
$group: {
_id: { document: '$document', subject: '$subject' },
context: { $push: { context: '$context' } },
category: { $first: '$Category' }
},
}])";
var items = this.Database.Db.RunCommand<Object>(query);
...
}
这里有这个方法的一个
projectId
和一个users
参数。尝试查找那些projectId 等于给定值且userId 是任意给定值的文档。当我重写为 C# 流利风格时,它看起来像这样:
public void GetData(ObjectId projectId, IList<ObjectId> users)
{
var items = this.Database.Users
.Aggregate()
.Match(p => p.projectId == projectId && users.Contains(p.user))
/*
.Group( p => new {document= p.Document, subject=p.Subject},
// p => new { ??? }
// ?????
// )
*/
.ToList();
...
}
不幸的是,我没有足够的经验来继续编写
.Group(..)
部分(尤其是其中的 $push
),这只是整个查询的一小部分,还有另一个 Group()
和一些 Unwind()
以及一些Project()
之后,因此我决定按原样使用它,并应用RunCommand()
。
但我不知道如何将
RunCommand()
与参数一起使用,或者...我应该生成包含当前值的查询字符串吗?
如何解决问题?你建议我继续做什么?提前非常感谢!