2015-06-04 3 views
0

У меня есть следующие документы в моей коллекции:матч поддокумент в другой поддокументе же документ

{ 
"_id": ObjectId('555a33d69487b45401ec1149'), 
"nombre": "demo", 
"roles": [ 
    { 
     "id": ObjectId('556ca1999487009c1fac125f'), 
     "nombre": "rol1" 
    }, 
    { 
     "id": ObjectId('556ca1a09487009c1fac1260'), 
     "nombre": "rol2" 
    }, 
    { 
     "id": ObjectId('556ca1a69487009c1fac1261'), 
     "nombre": "rol3" 
    } 
], 
"usuarios": [ 
    { 
     "id": ObjectId('556ca1de9487009c1fac1262'), 
     "activo": true, 
     "roles": [ 
      { 
       "id": ObjectId('556ca1999487009c1fac125f') 
      } 
     ] 
    }, 
    { 
     "id": ObjectId('556ca2659487009c1fac1263'), 
     "activo": true, 
     "roles": [ 
      { 
       "id": ObjectId('556ca1a09487009c1fac1260') 
      } 
     ] 
    }, 
    { 
     "id": ObjectId('556ca27a9487009c1fac1264'), 
     "activo": true, 
     "roles": [ 
      { 
       "id": ObjectId('556ca1a69487009c1fac1261') 
      } 
     ] 
    } 
] 
} 


{ 
    "_id": ObjectId('556f457594877b4502b2e85d'), 
    "nombre": "app3", 
    "roles": [ 
     { 
      "id": ObjectId('556f45fa94877b4502b2e864'), 
      "nombre": "rol1_app3" 
     }, 
     { 
      "id": ObjectId('556f460194877b4502b2e865'), 
      "nombre": "rol3_app3" 
     }, 
     { 
      "id": ObjectId('556f460694877b4502b2e866'), 
      "nombre": "rol5_app3" 
     }, 
     { 
      "id": ObjectId('556f460b94877b4502b2e867'), 
      "nombre": "rol7_app3" 
     } 
    ], 
    "usuarios": [ 
     { 
      "id": ObjectId('556ca1de9487009c1fac1262'), 
      "activo": true, 
      "roles": [ 
       { 
        "id": ObjectId('556f460b94877b4502b2e867') 
       }, 
       { 
        "id": ObjectId('556f460194877b4502b2e865') 
       } 
      ] 
     } 
    ] 
} 

Что я хочу, чтобы указать «usuarios.id» и получить все «roles.id», " role.nombre "по каждому документу, где существует« usuarios.id ».

Я попытался это:

- первый объявить вар с 'usuarios.id' я ищу

var uid = new ObjectId("556ca1de9487009c1fac1262") 

тогда я выполнить это:

db.aplicacion.aggregate([ 
{ $match: { "usuarios.id" : uid, "usuarios.activo" : true } }, 
{ $unwind: "$usuarios"}, 
{ $unwind: "$usuarios.roles"}, 
{ $match: { "usuarios.id" : uid } }, 
{ $unwind: "$roles"}, 
{ $project: { "nombre":1, "usuarios.roles.id":1 , "usuarios.id":1,  "roles.id":1, "roles.nombre":1 }} 
]).pretty(); 

Но результатом является следующее:

{ 
     "_id" : ObjectId("555a33d69487b45401ec1149"), 
     "nombre" : "demo", 
     "roles" : { 
       "id" : ObjectId("556ca1999487009c1fac125f"), 
       "nombre" : "rol1" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556ca1999487009c1fac125f") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("555a33d69487b45401ec1149"), 
     "nombre" : "demo", 
     "roles" : { 
       "id" : ObjectId("556ca1a09487009c1fac1260"), 
       "nombre" : "rol2" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556ca1999487009c1fac125f") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("555a33d69487b45401ec1149"), 
     "nombre" : "demo", 
     "roles" : { 
       "id" : ObjectId("556ca1a69487009c1fac1261"), 
       "nombre" : "rol3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556ca1999487009c1fac125f") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f45fa94877b4502b2e864"), 
       "nombre" : "rol1_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460b94877b4502b2e867") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460194877b4502b2e865"), 
       "nombre" : "rol3_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460b94877b4502b2e867") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460694877b4502b2e866"), 
       "nombre" : "rol5_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460b94877b4502b2e867") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460b94877b4502b2e867"), 
       "nombre" : "rol7_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460b94877b4502b2e867") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f45fa94877b4502b2e864"), 
       "nombre" : "rol1_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460194877b4502b2e865") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460194877b4502b2e865"), 
       "nombre" : "rol3_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460194877b4502b2e865") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460694877b4502b2e866"), 
       "nombre" : "rol5_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460194877b4502b2e865") 
       } 
     } 
} 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460b94877b4502b2e867"), 
       "nombre" : "rol7_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460194877b4502b2e865") 
       } 
     } 
} 

Это продукт каждого rol.id, что я ожидал, чтобы это что-то вроде этого (получить только те, где roles.id = usuarios.roles.id:

{ 
     "_id" : ObjectId("555a33d69487b45401ec1149"), 
     "nombre" : "demo", 
     "roles" : { 
       "id" : ObjectId("556ca1999487009c1fac125f"), 
       "nombre" : "rol1" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556ca1999487009c1fac125f") 
       } 
     } 
}, 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460b94877b4502b2e867"), 
       "nombre" : "rol7_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460b94877b4502b2e867") 
       } 
     } 
}, 
{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : { 
       "id" : ObjectId("556f460194877b4502b2e865"), 
       "nombre" : "rol3_app3" 
     }, 
     "usuarios" : { 
       "id" : ObjectId("556ca1de9487009c1fac1262"), 
       "roles" : { 
         "id" : ObjectId("556f460194877b4502b2e865") 
       } 
     } 
} 

Любые идеи ??

Это мой текущий сценарий:

var uid = new ObjectId("556ca1de9487009c1fac1262") 

db.aplicacion.aggregate([ 
    { $match: { "usuarios.id" : uid, "usuarios.activo" : true } }, 
    { $unwind: "$usuarios"}, 
    { $unwind: "$usuarios.roles"}, 
    { $match: { "usuarios.id" : uid } }, 
    { $unwind: "$roles"}, 
    { $project: { "nombre":1, "usuarios.roles.id":1 , "usuarios.id":1,  "roles.id":1, "roles.nombre":1 }} 
    ]).pretty(); 

UPDATE:

После использования @yogesh решения, я сделал небольшое усовершенствование сценария:

db.coll.aggregate({ 
    "$unwind": "$usuarios" 
}, { 
    "$match": { 
     "usuarios.id": ObjectId("556ca1de9487009c1fac1262"), 
     "usuarios.activo":true, 
    } 
}, { 
    "$unwind": "$usuarios.roles" 
}, { 
    "$unwind": "$roles" 
}, { 
    "$project": { 
     "nombre": 1, 
     "roles.id": 1, 
     "roles.nombre": 1,   
     "roles.activo": 1, 
     "matched": { 
      "$eq": ["$roles.id", "$usuarios.roles.id"], //macthed roles.id == usuarios.roles.id    
     } 
    } 
}, { 
    "$match": { 
     "matched": true, 
     "roles.activo" : true 
    } 
}, 
{ 
    $group : { 
     _id : "$_id", 
     nombre: { $first: "$nombre" }, 
     roles : { 
       $push : "$roles" 
     } 

    } 
}).pretty(); 

Добавлен $ я думаю:

{ 
     "_id" : ObjectId("556f457594877b4502b2e85d"), 
     "nombre" : "app3", 
     "roles" : [ 
       { 
         "id" : ObjectId("556f460b94877b4502b2e867"), 
         "nombre" : "rol7_app3", 
         "activo" : true 
       }, 
       { 
         "id" : ObjectId("556f460194877b4502b2e865"), 
         "nombre" : "rol3_app3", 
         "activo" : true 
       } 
     ] 
} 
{ 
     "_id" : ObjectId("555a33d69487b45401ec1149"), 
     "nombre" : "demo", 
     "roles" : [ 
       { 
         "id" : ObjectId("556ca1999487009c1fac125f"), 
         "nombre" : "rol1", 
         "activo" : true 
       } 
     ] 
} 

Еще раз спасибо @yogesh

ответ

0

Вашей агрегация пропустила некоторые вещи вы должны сопоставляетесь в project для macthed roles.id == usuarios.roles.id проверки ниже агрегирования:

db.collectionName.aggregate({ 
    "$unwind": "$usuarios" 
}, { 
    "$match": { 
     "usuarios.id": ObjectId("556ca1de9487009c1fac1262") 
    } 
}, { 
    "$unwind": "$usuarios.roles" 
}, { 
    "$unwind": "$roles" 
}, { 
    "$project": { 
     "nombre": 1, 
     "roles": 1, 
     "usuarios.id": 1, 
     "usuarios.activo": 1, 
     "usuarios.roles.id": 1, 
     "matched": { 
      "$eq": ["$roles.id", "$usuarios.roles.id"] //macthed roles.id == usuarios.roles.id 
     } 
    } 
}, { 
    "$match": { 
     "matched": true 
    } 
}).pretty() 
+0

, что на самом деле работает! , благодаря!!! –

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