使用 mongoDB C# 驱动程序,如何使用 args 执行 runCommand?

问题描述 投票:0回答:1

我有一个(对我来说)非常复杂的 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()
与参数一起使用,或者...我应该生成包含当前值的查询字符串吗?

如何解决问题?你建议我继续做什么?提前非常感谢!

c# mongodb mongodb-query mongodb-.net-driver
1个回答
0
投票

我不建议在这里使用 RunCommand,相反你可以:

  1. 将您想要的
    $group
    阶段参数作为原始字符串 (
    .Group("..", "..")
    )。 Mongo 驱动程序允许从字符串隐式创建所需的参数。请参阅 $match 和 $project 阶段的示例此处
  2. 您始终可以使用 AppendStage(请参阅此处)。您可以在其中以字符串形式提供整个 $group 阶段。比如:
    .AppendStage("{ '$group': { '_id' ..
© www.soinside.com 2019 - 2024. All rights reserved.