2016-11-30 3 views
0

У меня есть некоторые документы, как это:Получить значение поля из массива суб документа

{ 
    "hash": "14a076f9f6cecfc58339330eeb492e267f63062f6d5f669c7cdbfecf9eb4de32", 
    "started_services": [], 
    "deleted_files": [], 
    "software": { 
     "adobe" : { 
      "licenses" : [ 
        { "key": "2384723", 
        "date": "26-10-2012" 
        }, 
        { "key": "23888823", 
        "date": "09-11-2012" 
        } 
      ] 
     } 
    } 
} 

Как получить только значение хеш-функции и список значений «ключевых»?

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

> db.repository.find({"$and": [{"datetime_int": {"$gte": 1451952000}},{"software.adobe.licenses.key" : { $exists : true}}]}, {hash:1, "software.adobe.licenses.key":1, _id:0}).limit(10) 

{ "hash" : "a1532e0609aaf6acfa9e505e93af0bee0856a9a67398aeaa72aa6eb2fffd134e", "software" : { "adobe" : { "licenses" : [ { "key" : "2008350" }, { "key" : "2018350" }, { "key" : "2028350" }, { "key" : "2038350" }, { "key" : "2048350" }, { "key" : "2058350" }, { "key" : "2068350" }, { "key" : "2078350" }...]}}} 

Результат я хочу, должен выглядеть следующим образом:

{"hash": "a1532e0609aaf6acfa9e505e93af0bee0856a9a67398aeaa72aa6eb2fffd134e", 
"key": ["2008350", "2018350", "2028350", "2038350", "2048350", "2058350", "2068350", "2078350"] 
} 

Как сделать это?

+0

Является ли "саман" динамическое поле? – styvane

+0

нет. Все это статические поля. Значения были изменены, чтобы все выглядело маленьким и простым. – user1717931

ответ

1

Вы можете сделать это с помощью структуры агрегации.

db.repository.aggregate([ 
    { "$match": { 
     "datetime_int": { "$gte": 1451952000 }, 
     "software.adobe.licenses.key" : { "$exists" : true } 
    }}, 
    { "$project": { 
     "hash": 1, 
     "key": { 
      "$map": { 
       "input": "$software.adobe.licenses", 
       "as": "soft", 
       "in": "$$soft.key" 
      } 
     } 
    }} 
]) 

Начиная с MongoDB 3.2 вы можете напрямую спроецировать поле массива поддокумента.

{ "$project": { "hash": 1, "key": "$software.adobe.licenses.key"}} 
+0

, так как я использую версию = 3.2.x, я использовал ваше другое предложение, и оно работает хорошо. Благодаря! – user1717931

1
db.key.aggregate((
{ "$match": { 
     "datetime_int": { "$gte": 1451952000 } 
     }}, 
{"$unwind":"$software.adobe.licenses"}, 
{"$project":{"key":"$software.adobe.licenses.key", "hash":1, "_id":0}} 
)) 

выводит следующее:

{ "hash" : "14a076f9f6cecfc58339330eeb492e267f63062f6d5f669c7cdbfecf9eb4de32", "key" : [ "2384723", "23888823" ] } 
+0

Использование '$ unwind' - это не очень хорошая идея. – styvane

+0

ОК. будет иметь в виду. Благодарю. –

Смежные вопросы