【问题标题】:mongodb array size aggregation size failingmongodb数组大小聚合大小失败
【发布时间】:2017-03-14 13:34:19
【问题描述】:

您好,我查看了文档:https://docs.mongodb.com/manual/reference/operator/aggregation/size/ 从我读到的内容来看,如果我有一个带有 authors 属性的对象,并且在其中我有多个作者 a.k.a 数组,我应该在聚合中使用 size 但我得到一个错误:

如果我点击 db.posts.find().pretty() 我会得到:

{
	"_id" : ObjectId("58c7e35a8a00f209be819771"),
	"allReviewsLink" : "link somewhere",
	"totalReviewCount" : "200"
}
{
    	"_id" : ObjectId("58c7e515be41d40a39954a38"),
    	"authors" : [
    		"Linda",
    		"Benn",
    		"Carolyn"
    	]
    }

这就是我尝试但没有成功的方法:

db.posts.aggregate(    [       {$size: {"$authors"             }          }           ] )

posts 是我的收藏,我收到以下错误:SyntaxError: missing : after property id @(shell):1:63

【问题讨论】:

  • $size 运算符与$project 阶段一起使用。类似db.posts.aggregate( [ {$project:{ size: {$size: "$authors" }}} ] )
  • 我认为您不需要在authors 等属性前面使用$
  • 我编辑了我的问题,也许有助于澄清。
  • 使用db.posts.aggregate( [ {$project:{ size: {$size: {$ifNull:["$authors", []] }}}} ] ) 容纳不存在的字段。或者,您也可以使用$match$project 阶段之前过滤这些文档
  • 是的!!!这是答案伙伴。请回答它,以便我验证它;)

标签: mongodb aggregation-framework


【解决方案1】:

您可以通过多种方式做到这一点。

此查询会将不存在的 authors 值设置为大小 0。

db.posts.aggregate( [ {$project:{ size: {$size: {$ifNull:["$authors", []] }}}} ] )

或者您也可以先使用$match 过滤文档,然后计算大小。

db.posts.aggregate( [ {$match:{authors:{$exists:true}}},{$project:{ size: {$size:"$authors" }}} ] )

【讨论】:

    【解决方案2】:

    在聚合中使用 $Project,

              db.posts.aggregate( [ {$project:{ size: {$size: {$ifNull:["$authors", []] }}}} ] )
    

    【讨论】:

    • 上面的命令应该返回 size: 3,你的预期输出是什么?
    • 哦,好吧,你是用 mongoshell 来执行这个命令,还是别的什么? ,对我来说,我已经在 mongodb 3.2 shell 中执行了这个命令
    • 是的 mongoshell,我得到以下信息:错误:命令失败:{“ok”:0,“errmsg”:“$size 的参数必须是一个数组,但类型:缺失” ,“代码”:17124,“代码名称”:“Location17124”}:聚合失败:
    • 是的,抱歉,对于 null 场景,我们需要为 $size 添加空数组,我编辑了我的答案
    猜你喜欢
    • 2013-01-12
    • 2018-07-28
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多