2013-12-11 5 views
2

Привет У меня есть модель данных, как этотMongoDB Встроенный документ запрашивая

module{ 
    name: "xx", 
    sa: [ 
     { 
      sa_name: "yy", 
      fact: [ 
       fact_name: "zz" 
      ], 
      dim: [ 
       dim_name: "qq" 
      ] 
     } 
    ] 
} 

Я са, встроенного в модуль и тем, и DIM вложенной внутри са.

Я пробовал db.coll.find({"module.sa.fact.name":"zz"},{}) не работает ни на что, кроме как на одно гнездо db.coll.find({"module.sa.name":"yy"},{}) работает нормально. Как я могу запросить этот вспомогательный документ внутри вспомогательного документа.

+0

Документ недействителен, массив не может содержать непосредственно поля, то есть 'fact: [fact_name:" zz "]' должен быть 'фактом : [{fact_name: "zz"}] ' – mnemosyn

ответ

5

Обновить ваш запрос как:

db.coll.find({"module.sa" : {$elemMatch : {"fact.fact_name": "zz"}}}) 
+0

Это работает, но оно решает проблему, исправляя опечатки, а не из-за' $ elemMatch'. Фактически, '$ elemMatch' предназначен для сопоставления * нескольких критериев * для одного элемента массива, который здесь * не * требуется здесь. Также обратите внимание, что это все еще использует multikey, потому что в схеме OP 'fact' является самим массивом, поэтому можно утверждать, что нужно использовать' $ elemMatch'. – mnemosyn

2

Для меня вопрос просто работает нормально, см Монго 2.4.8 оболочка:

> db.coll.insert({module: {name:"xx", sa: [{sa_name:"yy", fact:[{fact_name:"zz"}], dim:[{dim_name:"qq"}]}]}}) 
> db.coll.findOne() 
{ 
     "_id" : ObjectId("52a85b44fd0b335ab0546ca4"), 
     "module" : { 
       "name" : "xx", 
       "sa" : [ 
         { 
           "sa_name" : "yy", 
           "fact" : [ 
             { 
               "fact_name" : "zz" 
             } 
           ], 
           "dim" : [ 
             { 
               "dim_name" : "qq" 
             } 
           ] 
         } 
       ] 
     } 
} 
> db.coll.findOne({"module.sa.fact.fact_name":"zz"}) 
{ 
     "_id" : ObjectId("52a85b44fd0b335ab0546ca4"), 
     "module" : { 
       "name" : "xx", 
       "sa" : [ 
         { 
           "sa_name" : "yy", 
           "fact" : [ 
             { 
               "fact_name" : "zz" 
             } 
           ], 
           "dim" : [ 
             { 
               "dim_name" : "qq" 
             } 
           ] 
         } 
       ] 
     } 
} 

Может быть, что вы просто возникли проблемы с какая-то опечатка, поскольку вы запрашиваете "module.sa.fact.name", где должно быть "module.sa.fact.fact_name". Однако эта проблема также верна для запроса, который, кажется, работает для вас ...

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