c# - 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();
解决方案
不完全是,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);
推荐阅读
- python - Python - 在 Jupyter Notebook 中绘制双重打印(使用 Statsmodel 时)
- postgresql - 在 PostgreSQL 全文搜索中使用“websearch_to_tsquery”进行前缀/通配符搜索?
- flutter - 淡入网络图像在加载后调整大小
- django - 如何通过 Django 提供独立的静态应用程序
- python-3.x - 以下 Lambda 函数是什么意思?
- networking - 了解 TCP/UDP 客户端端口分配
- ios - 为什么 UIGraphicsGetCurrentContext 在 UIGraphicsBeginImageContext 之后返回 nil
- javascript - 剑道编辑器:更改事件仅触发一次
- r - USarrests data frame to tibble with scaling in R
- node.js - TypeError:BrowserWindow 不是构造函数