首页 > 解决方案 > AggregateFluent 和聚合查询

问题描述

我有以下聚合查询

aggregate(
[{"$facet": 
    {"home": [{"$match": {"$expr": {"$eq": ["$IsHomePage", true]}}}],
      "notHome": 
      [{"$match": 
          {"$expr": 
            {"$and": 
              [{"$ne": ["$IsHomePage", true]}, {"$eq": ["$IsTagged", true]}]}}},
        {"$sample": {"size": 50}}]}},
  {"$project": {"union": {"$concatArrays": ["$home", "$notHome"]}}},
  {"$unwind": {"path": "$union"}},
  {"$replaceRoot": {"newRoot": "$union"}}])

是否可以将此代码存储在变量中,然后从AggregateFluent

return await db.posts.Aggregate<Post>(VARIABLE_NAME).ToListAsync();

标签: c#.netmongodb

解决方案


不完全是,Aggregate支持PipelineDefinition作为输入参数,它分别接受每个阶段,如:

  var pipeline = PipelineDefinition<Post, Post>.Create(
            "{ <aggregate stage1> }",
            "{ <aggregate stage2> }");

如果你想使用上面提到的语法,你应该使用:

  var coll = db.GetCollection<Post>("coll")
            .Aggregate<Post>()
            .AppendStage<Post>("{ <stage1> }")
            .AppendStage<Post>("{ <stage2> }");

要创建 PipelineDefinition,您也可以使用 EmptyPipelineDefinition:

  var pipelineDefinition = new EmptyPipelineDefinition<Post>()
            .AppendStage<Post, Post, Post>("{ <stage1> }")
            .AppendStage<Post, Post, Post>("{ <stage2> }");

另外,请注意您可以将构建器用于构面本身,例如:

   var pipeline = PipelineDefinition<BsonDocument, BsonDocument>.Create(
            "{ $unwind : \"$tags\" }",
            "{ $sortByCount : \"$tags\" }");
   var facet = AggregateFacet.Create("name", pipeline);

   var result = subject.Facet(facet);

推荐阅读