2014-02-18 5 views
0

Я хочу получить массив учетной записи, если запрос найти роль «элиты»Получить конкретное поле Mongoose

я попробовать с

db.users.aggregate(
{ $match : { "account.role" : "Elite" } } 
); 

Но у меня есть все объекты ...

{ 
"_id" : ObjectId("7623902143981943"),   
"account" : [ 
    { 
     "role" : "Elite",    
     "action" : [ 
      "create", 
      "read", 
      "update", 
      "delete" 
     ], 
     "extra" : { 
      account:[1,2,3,4] 
     } 
    }, 
{ 
     "role" : "User",    
     "action" : [ 
      "create", 
      "read", 
      "update", 
      "delete" 
     ], 
     "extra" : { 
      account:[10] 
     } 
    } 
],  

}

Могу ли я получить только дополнительный массив (учетная запись: [1,2,3,4]), если это положительный результат запроса? или я должен разобрать полученный объект? (схема очень упрощена, но у меня есть много ролей)

ответ

1

Вы должны использовать $project и $unwind:

//Order of $unwind and $match matters 
db.users.aggregate(
{$unwind: "$account"}, 
{$match : { "account.role" : "Elite" }}, 
{$project : { "extra.account" : 1}} 
); 

объяснение

$ размотать расщепляет массив в различные элементы. См. Эффект от

db.users.aggregate({$unwind: "$account"}) 

тогда вы сопоставляете элементы с {"account.role": "Elite"}. Смотрите эффект:

db.users.aggregate(
{$unwind: "$account"}, 
{$match : { "account.role" : "Elite" }} 
); 

И тогда вы, наконец, проецировать только нужные поля

db.users.aggregate(
{$unwind: "$account"}, 
{$match : { "account.role" : "Elite" }}, 
{$project : { "extra.account" : 1}} 
); 

//You can also remove the _id filed (included by default with: 
db.users.aggregate(
{$unwind: "$account"}, 
{$match : { "account.role" : "Elite" }}, 
{$project : { _id: 0, "extra.account" : 1}} 
); 

OLD ОТВЕТ

Вы должны использовать проекцию: db.users.aggregate ( { $ match: {"account.role": "Elite"}}, {$ project: {"extra.account": 1}} );

Кроме того, если вы только соответствующие документы, нет необходимости использовать агрегацию framewrok, и вы можете просто использовать:

// No projection here 
db.users.find({"account.role" : "Elite"}) 

или

// Only returns the _id field + "extra.account" field if exists. By default the _id field is included 
db.users.find({"account.role" : "Elite"}, { "extra.account" : 1}) 

// Only returns the "extra.account" field if exists 
db.users.find({"account.role" : "Elite"}, { _id: 0, "extra.account" : 1}) 

MongoDB документацию можно найти here и here

+0

Спасибо, но у меня есть это исключение ошибки: объект спецификации этапа конвейера должен содержать ровно одно поле. ' – Twinsen

+0

Я отредактировал ответ на 'aggregate ({$ match: ..}, {$ project: ...})' вместо 'aggregate ({$ match: .., $ project: ...})' , Ссылка может быть найдена [здесь] (http://docs.mongodb.org/manual/core/aggregation-pipeline/) –

+0

Еще раз спасибо, но в моих результатах у меня есть два дополнительных.экзамена массива Elite и extra.account User. Могу ли я получить только Elite? – Twinsen

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