使用"$ count"在"addField"中, MongoDB聚合中的操作

编程入门 行业动态 更新时间:2024-10-26 12:27:55
本文介绍了使用"$ count"在"addField"中, MongoDB聚合中的操作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我试图找到聚合运算符的正确组合,以将标题为"totalCount"的字段添加到我的mongoDB视图中.

这将使我获得聚合管道此特定阶段的计数,并根据每个文档的计数结果将其输出:

{ $count: "count" }

但是我最终得到的结果是一个文档,而不是我要尝试完成的结果,那就是将该值打印为addedField,它是所有文档中的字段/值,甚至更好的是,该值将in addition打印到返回的文档中.

我已经尝试过了,但是它给我一个错误"无法识别的表达式'$ count',":

{ $addFields: { "totalCount" : { $count: "totalCount" } } }

为此正确的语法构造是什么?是否可以通过这种方式执行此操作,或者我是否需要使用$sum或其他一些运算符来进行此操作?我也尝试过这个:

{ $addFields: { "totalCount" : { $sum: { _id: 1 } } } },

...但是它并没有给我任何错误,它只是在每个文档上打印0作为该字段的值,而不是所有文档的总数.

解决方案

总计数始终是一个文档的结果,因此您需要 $ facet 来运行多个聚合管道,然后合并结果.假设您的常规管道包含简单的$project,并且您想将其结果与$count合并.您可以在聚合以下运行:

db.col.aggregate([ { $facet: { totalCount: [ { $count: "value" } ], pipelineResults: [ { $project: { _id: 1 } // your regular aggregation pipeline here } ] } }, { $unwind: "$pipelineResults" }, { $unwind: "$totalCount" }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$pipelineResults", { totalCount: "$totalCount.value" } ] } } } ])

在$facet阶段之后,您将获得像这样的单个文档

{ "totalCount" : [ { "value" : 3 } ], "pipelineResults" : [ { "_id" : ObjectId("5b313241120e4bc08ce87e46") }, //.... ] }

然后,您必须使用 $ unwind 来将数组转换为多个文档,并使用 $ replaceRoot href ="docs.mongodb/manual/reference/operator/aggregation/mergeObjects/index.html" rel ="noreferrer"> $ mergeObjects ,以将常规管道结果提升到根级别.

I am trying to find the correct combination of aggregation operators to add a field titled "totalCount" to my mongoDB view.

This will get me the count at this particular stage of the aggregation pipeline and output this as the result of a count on each of the documents:

{ $count: "count" }

But I then end up with one document with this result, rather than what I'm trying to accomplish, which is to make this value print out as an addedField that is a field/value on all of the documents, or even better, a value that prints in addition to the returned documents.

I've tried this but it gives me an error ""Unrecognized expression '$count'",":

{ $addFields: { "totalCount" : { $count: "totalCount" } } }

What would the correct syntactical construction be for this? Is it possible to do it this way, or do I need to use $sum, or some other operator to make this work? I also tried this:

{ $addFields: { "totalCount" : { $sum: { _id: 1 } } } },

... but while it doesn't give me any errors, it just prints 0 as the value for that field on every document rather than the total count of all documents.

解决方案

Total count will always be a one-document result so you need $facet to run mutliple aggregation pipelines and then merge results. Let's say your regular pipeline contains simple $project and you want to merge it's results with $count. You can run below aggregation:

db.col.aggregate([ { $facet: { totalCount: [ { $count: "value" } ], pipelineResults: [ { $project: { _id: 1 } // your regular aggregation pipeline here } ] } }, { $unwind: "$pipelineResults" }, { $unwind: "$totalCount" }, { $replaceRoot: { newRoot: { $mergeObjects: [ "$pipelineResults", { totalCount: "$totalCount.value" } ] } } } ])

After $facet stage you'll get single document like this

{ "totalCount" : [ { "value" : 3 } ], "pipelineResults" : [ { "_id" : ObjectId("5b313241120e4bc08ce87e46") }, //.... ] }

Then you have to use $unwind to transform arrays into multiple documents and $replaceRoot with $mergeObjects to promote regular pipeline results into root level.

更多推荐

使用"$ count"在"addField"中, MongoDB聚合中的操作

本文发布于:2023-11-22 12:59:47,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1617506.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作   count   quot   MongoDB   addField

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!