2016-06-10 62 views
1

我已经收集在一个文件“健身房”看起来像下面这样:获取每个文档的数组的大小子阵列

"name" : "Testing", 
"albums" : [ 
    { 
     "name" : "Aerobics", 
     "photos" : [ 
      { 
       "filepath" : "aerobics.jpg" 
      } 
     ] 
    }, 
    { 
     "name" : "Aqua", 
     "photos" : [ 
      { 
       "filepath" : "aqua.jpg" 
      } 
     ] 
    }, 
    { 
     "name" : "Zumba", 
     "photos" : [ 
      { 
       "filepath" : "zumba.jpg" 
      } 
     ] 
    } 
], 

我想选择的照片数量从每张专辑到投影。

所以我的输出将如下所示:

"name" : "Testing", 
"albums" : [ 
    { 
     "name" : "Aerobics", 
     "amount_photos" : 1, 
     "photos" : [ 
      { 
       "filepath" : "aerobics.jpg" 
      } 
     ] 
    }, 
    { 
     "name" : "Aqua", 
     "amount_photos" : 1, 
     "photos" : [ 
      { 
       "filepath" : "aqua.jpg" 
      } 
     ] 
    }, 
    { 
     "name" : "Zumba", 
     "amount_photos" : 1, 
     "photos" : [ 
      { 
       "filepath" : "zumba.jpg" 
      } 
     ] 
    } 
] 

它应该是具有聚合实现,但我得到以下错误,当我尝试我的查询:

的参数$大小必须是一个数组,但类型的:字符串

查询:

db.gyms.aggregate(
    [ 
     { 
     $project: { 
      'albums.photos' : { 
       amountPhotos: { $size: "photos" } 
      } 
     } 
     } 
    ] 
) 

回答

1

执行此操作的最佳和有效方法是使用$map运算符,该运算符允许您使用“photos”数组的$size返回一系列子文档。

db.gyms.aggregate( 
    [ 
     { "$project": { 
      "name": 1, 
      "albums": { 
       "$map": { 
        "input": "$albums", 
        "as": "album", 
        "in": { 
         "amount_photos": { "$size": "$$album.photos" }, 
         "name": "$$album.name", 
         "photos": "$$album.photos" 
        } 
       } 
      } 
     }} 
    ] 
) 
+0

我以为mongo会有一个更简单的方法来做到这一点,显然不是。谢谢! – Jamie

+0

@Jamie这很简单;) – styvane

+0

更短的方式*像我的查询。 – Jamie