2014-02-10 1 views
2

Пожалуйста, см следующего документа:получить число элементов из встроенного массива в качестве ответа MongoDB

{ 
    "assetId": ObjectId("5214817cccf3d82198561444"), 
    "entityType": "MOVIE", 
    "lastUpdate": NumberLong(1392034838964), 
    "name": "testMovie", 
    "resources": [ 
     { 
      "jobId": ObjectId("52f8c302056f0728d16951f6"), 
      "lastModifiedTime": NumberLong(1392034563729), 
      "name": "testMovie", 
      "status": "ERROR", 
      "type": "IMAGE_3_2" 
     }, 
     { 
      "jobId": ObjectId("52f8c416056f0728d16951fd"), 
      "lastModifiedTime": NumberLong(1392034838964), 
      "name": "testMovie", 
      "status": "ERROR", 
      "type": "IMAGE_3_1" 
     } 
    ], 
    "sandBoxId": "52146e1bccf26997695ca9c0", 
    "sandboxName": "test" 
} 

Я пытаюсь выяснить, как написать запрос, который будет отвечать мне число элементов из «ресурсов» массив по типу.

, например, (илл записать его в псевдокоде, а не Монго запрос): матч AssetID: 5214817cccf3d82198561444 где resource.type = IMAGE_3_1 & IMAGE_3_2

ответ в этом случае должно быть:

{ 
       "jobId": ObjectId("52f8c302056f0728d16951f6"), 
       "lastModifiedTime": NumberLong(1392034563729), 
       "name": "testMovie", 
       "status": "ERROR", 
       "type": "IMAGE_3_2" 
      }, 
      { 
       "jobId": ObjectId("52f8c416056f0728d16951fd"), 
       "lastModifiedTime": NumberLong(1392034838964), 
       "name": "testMovie", 
       "status": "ERROR", 
       "type": "IMAGE_3_1" 
      } 

Я понял, как получить один элемент из массива в качестве ответа, но не количество элементов.

* Опять же, извините за псевдокод

ответ

1

Чтобы получить несколько результатов внутри массива, используйте агрегат и $unwind.

db.collection.aggregate([ 
    {$unwind: "$resources"}, 
    {$match: { "resources.type": {$in :["IMAGE_3_1", "IMAGE_3_2"]}} }, 
    {$project: {_id: 0, resources: 1} } 
]) 

Необязательно $ матч первого, а также ограничить документы, которые обрабатываются в агрегации только тем, что будет содержать матч. Фаза $ project может быть любой, что вам нужно.

+0

Это сработало! благодаря :) – amazia

0

Если вы ищете только счет, то:

db.collection.aggreate([ 
     {$unwind: "$resources"}, 
     {$match: {"assetId": ObjectId("5214817cccf3d82198561444"), "resources.type": {$in: ["IMAGE_3_1", "IMAGE_3_2"]}}} 
     {$group: { _id: null, count: { $sum: 1 }} 
    ])