2016-05-18 4 views
0

У меня есть следующая структура для моих документов Mongodb, и, как вы увидите, у меня есть 3 URL-адреса, каждый из которых имеет crawled, установленный в True или False.MongoDB - Возврат определенных полей документа

{ 
    "_id": { 
     "$oid": "573b8e70e1054c00151152f7" 
    }, 
    "domain": "example.com", 
    "good": [ 
     { 
      "crawled": true, 
      "added": { 
       "$date": "2016-05-17T21:34:34.485Z" 
      }, 
      "link": "/threads/11005-Cheap-booze!" 
     }, 
     { 
      "crawled": false, 
      "added": { 
       "$date": "2016-05-17T21:34:34.485Z" 
      }, 
      "link": "/threads/9445-This-week-s-voucher-codes" 
     }, 
     { 
      "crawled": false, 
      "added": { 
       "$date": "2016-05-17T21:34:34.485Z" 
      }, 
      "link": "/threads/9445-This-week-s-voucher-codes_2" 
     } 
    ], 

    "link_found": false, 
    "subdomain": "http://www." 
} 

Я пытаюсь вернуть определенные поля, где возвращаются только те URL с crawled установлен False, для этого я следующий запрос:

.find({'good.crawled' : False}, {'good.link':True, 'domain':True, 'subdomain':True}) 

Однако то, что возвращается против того, что ожидается, отличается, поскольку это возвращение всех URL-адресов, независимо от того, имеют ли они crawled статус True или False

Что возвращается является:

{ 
    u'domain': u'cashquestions.com', 
    u'_id': ObjectId('573b8e70e1054c00151152f7'), 
    u'subdomain': u'http://www.', 
    u'good': [ 
     { 
      u'link': u'/threads/11005-Cheap-booze!' 
     }, 
     { 
      u'link': u'/threads/9445-This-week-s-voucher-codes' 
     }, 
     { 
      u'link': u'/threads/9445-This-week-s-voucher-codes_2' 
     } 
      ] 
} 

Что ожидается:

{ 
    u'domain': u'cashquestions.com', 
    u'_id': ObjectId('573b8e70e1054c00151152f7'), 
    u'subdomain': u'http://www.', 
    u'good': [ 
     { 
      u'link': u'/threads/9445-This-week-s-voucher-codes' 
     }, 
     { 
      u'link': u'/threads/9445-This-week-s-voucher-codes_2' 
     } 
      ] 
} 

Как я могу указать, что только ссылки с crawled набора к False возвращается?

+3

Возможный дубликат http://stackoverflow.com/questions/3985214/retrieve-only-the -queried-элемент-в-ан-объект-массив-в-MongoDB-коллекция –

ответ

0

Вы хотите использовать структуру агрегации (это будет работать в MongoDB 3.0 и более поздних):

db.yourcolleciton.aggregate([ 
    // optional: only those with at least one false 
    {$match: {'good.crawled': false}}, 
    // get just the fields you need (plus _id) 
    {$project: {good:1, domain:1, subdomain: 1}}, 
    // get each in a separate temporary document 
    {$unwind: {'good': 1}}, 
    // limit to false 
    {$match: {'good.crawled': false}}, 
    // undoes the $unwind 
    {$group: {_id: "$_id", domain: {"$first": "$domain"}, 'subdomain' : {$first, '$subdomain'}, good: {"$push":"$good"}} 
])