2015-12-18 49 views
0

我有這樣一個集合:pymongo - 得到深度嵌套的objectID

db.attributes.find({"name" : {"en-UK" : "Fabric"}}).pretty(); 
{ 
    "_id" : ObjectId("5550dab4a14c9766418ff2dc"), 
    "values" : { 
     "source" : [ 
      { 
       "code" : 1, 
       "_id" : ObjectId("5550dab4a14c9766418ff2bf"), 
       "name" : { 
        "fr-FR" : "Coton", 
        "it-IT" : "Cotone", 
        "en-UK" : "Cotton", 
        "es-ES" : "Algodón" 
       } 
      }, 
      { 
       "code" : 2, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c0"), 
       "name" : { 
        "fr-FR" : "Viscose", 
        "it-IT" : "Viscosa", 
        "en-UK" : "Viscose", 
        "es-ES" : "Viscosa" 
       } 
      }, 
      { 
       "code" : 3, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c1"), 
       "name" : { 
        "fr-FR" : "Coton peigné", 
        "it-IT" : "Cotone pettinato", 
        "en-UK" : "Combed Cotton", 
        "es-ES" : "Algodón peinado" 
       } 
      }, 
      { 
       "code" : 4, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c2"), 
       "name" : { 
        "fr-FR" : "Polyester", 
        "it-IT" : "Poliestere", 
        "en-UK" : "Polyester", 
        "es-ES" : "Poliéster" 
       } 
      }, 
      { 
       "code" : 5, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c3"), 
       "name" : { 
        "fr-FR" : "Tencel© Lyocell", 
        "it-IT" : "Tencel© Lyocell", 
        "en-UK" : "Tencel© Lyocell", 
        "es-ES" : "Tencel© Lyocell" 
       } 
      }, 
      { 
       "code" : 6, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c4"), 
       "name" : { 
        "fr-FR" : "Coton peigné biologique", 
        "it-IT" : "Cotone pettinato biologico", 
        "en-UK" : "Combed Organic Cotton", 
        "es-ES" : "Algodón peinado orgánico" 
       } 
      }, 
      { 
       "code" : 7, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c5"), 
       "name" : { 
        "fr-FR" : "Viscose de bambou", 
        "it-IT" : "Viscosa di bamboo", 
        "en-UK" : "Bamboo Viscose", 
        "es-ES" : "Viscosa de bambú" 
       } 
      }, 
      { 
       "code" : 8, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c6"), 
       "name" : { 
        "fr-FR" : "Coton biologique", 
        "it-IT" : "Cotone biologico", 
        "en-UK" : "Organic Cotton", 
        "es-ES" : "Algodón orgánico" 
       } 
      }, 
      { 
       "code" : 9, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c7"), 
       "name" : { 
        "fr-FR" : "Polyester recyclé", 
        "it-IT" : "Poliestere riciclato", 
        "en-UK" : "Recycled Polyester", 
        "es-ES" : "Poliéster reciclado" 
       } 
      }, 
      { 
       "code" : 10, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c8"), 
       "name" : { 
        "fr-FR" : "Modal", 
        "it-IT" : "Modal", 
        "en-UK" : "Modal", 
        "es-ES" : "Modal" 
       } 
      }, 
      { 
       "code" : 11, 
       "_id" : ObjectId("5550dab4a14c9766418ff2c9"), 
       "name" : { 
        "fr-FR" : "Lycra Elastane", 
        "it-IT" : "Lycra élasthanne", 
        "en-UK" : "Lycra Elastane", 
        "es-ES" : "Licra Elastano" 
       } 
      }, 
      { 
       "code" : 12, 
       "_id" : ObjectId("5550dab4a14c9766418ff2ca"), 
       "name" : { 
        "fr-FR" : "Coton issu de culture biologique, recyclé pré-consommation", 
        "it-IT" : "Cotone coltivato biologicamente riciclato pre-consumo", 
        "en-UK" : "Recycled pre-consumer cotton organically grown", 
        "es-ES" : "Algodón orgánico reciclado pre-consumo" 
       } 
      }, 
      { 
       "code" : 13, 
       "_id" : ObjectId("5550dab4a14c9766418ff2cb"), 
       "name" : { 
        "fr-FR" : "Polyester recyclé post-consommation", 
        "it-IT" : "Poliestere riciclato post-consumo", 
        "en-UK" : "Recycled post-consumer polyester", 
        "es-ES" : "Polyéster recilado post-consumo" 
       } 
      }, 
      { 
       "code" : 14, 
       "_id" : ObjectId("5550dab4a14c9766418ff2cc"), 
       "name" : { 
        "fr-FR" : "Élasthanne", 
        "it-IT" : "Elasthan", 
        "en-UK" : "Elastane", 
        "es-ES" : "Elastano" 
       } 
      } 
     ], 
     "name" : [ 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2cd"), 
       "name" : { 
        "en-UK" : "3-ply Loopback" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2ce"), 
       "name" : { 
        "en-UK" : "Brushed 2-ply" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2cf"), 
       "name" : { 
        "en-UK" : "Brushed 3-ply" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d0"), 
       "name" : { 
        "en-UK" : "Canvas Weave" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d1"), 
       "name" : { 
        "en-UK" : "Fine Jersey" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d2"), 
       "name" : { 
        "en-UK" : "Fleece" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d3"), 
       "name" : { 
        "en-UK" : "Interlock" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d4"), 
       "name" : { 
        "en-UK" : "Jersey" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d5"), 
       "name" : { 
        "en-UK" : "Piqué" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d6"), 
       "name" : { 
        "en-UK" : "Plain weave" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d7"), 
       "name" : { 
        "en-UK" : "Rib" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d8"), 
       "name" : { 
        "en-UK" : "Sheer Jersey" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2d9"), 
       "name" : { 
        "en-UK" : "Supersoft Jersey" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2da"), 
       "name" : { 
        "en-UK" : "Twill weave" 
       } 
      }, 
      { 
       "_id" : ObjectId("5550dab4a14c9766418ff2db"), 
       "name" : { 
        "en-UK" : "Woven Twill" 
       } 
      } 
     ] 
    }, 
    "name" : { 
     "en-UK" : "Fabric" 
    } 
} 

我使用這個代碼來獲取fabric.name

def get_attribute_fabric(name): 
    attribute_fabric_meta = db.attributes.aggregate([{ '$match': {'name.en-UK': 'Fabric'} }, 
     { '$unwind' : '$values' }, 
     { '$project': { 'name' : '$values.name', 'valueId': '$values._id'} }, 
     { '$match': { 
      '$and': [ 
       {'name.en-UK': str(name)} 
      ] 
     } 
    }]) 

,但我得到這個錯誤

pymongo.errors.OperationFailure:命令SON([('aggregate',u'attributes'),('pipeline',[{'$ match ':{'name.en-UK':'Fabric'}},{'$ unwind':'$ values'},{'$ project':{'valueId':'$ values._id','name' :'$ values.name'}},{'$ match':{'$ and':[{'name.en-UK':'Jersey'}]}}])])失敗:exception:$ unwind:值在字段路徑末尾必須是數組

我想返回objectId

任何意見大加讚賞

回答

0

不能在'values'放鬆,因爲它不是一個數組。您必須平倉,而不是在'values.source'嘗試這種聚合管道代替,

[ 
    { '$match': {'name.en-UK': 'Fabric'} }, 
    { '$unwind' : '$values.source' }, 
    { '$project': { 'name' : '$values.source.name', 'valueId': '$values.source._id'} }, 
    { '$match': {'name.en-UK': str(name)}} 
] 

此外,我不認爲$並且需要在那裏。保持它只是哥們:)

+0

感謝,這是偉大的,我必須將代碼更改爲'def get_attribute_fabric(name): \t attribute_fabric_meta = db.attributes.aggregate([0126]\t \t { '$開卷': '$ values.name'}, \t \t { '$項目':{ '名': '$ values.name.name'}}, \t \t { '$匹配' :{'name.en-UK':name}} \t])'''爲它工作 – khinester

0

如果您正在使用MongoDB的3.2或更新版本,你可以使用$filter運營商能夠有效地這樣的:

def get_attribute_fabric(name): 
    pipeline = [{'$match': {'name.en-UK': 'Fabric'}}, 
     {'$project': {'name': {'$filter': {'input': '$values.name', 'as': 'n', 'cond': {'$eq': ['$$n.name.en-UK', name]}}}}} 
    ] 
    return db.attributes.aggregate(pipeline) 

演示:

>>> from pprint import pprint 
>>> pprint(list(get_attribute_fabric('Woven Twill'))) 
[{'_id': ObjectId('5550dab4a14c9766418ff2dc'), 
    'name': [{'_id': ObjectId('5550dab4a14c9766418ff2db'), 
      'name': {'en-UK': 'Woven Twill'}}]}] 
>>>