2013-06-13 2 views
3

у меня есть коллекция, которая хранит данные в этом формате:Как отформатировать результат запроса поиска mongodb?

{ 
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"), 
    name: 'sfdsfsdfsdfsdfsd' 
    details: { 
     varA: { 
      created: "2013-06-13T12:43:25.853Z", 
      validity: "2013-07-13T12:43:25.853Z", 
      modified: "2013-06-13T12:43:25.853Z" 
     }, 
     varB: { 
      created: "2013-06-13T12:43:25.853Z", 
      validity: "2013-07-13T12:43:25.853Z", 
      modified: "2013-06-13T12:43:25.853Z" 
     } 
    } 
} 

Я хотел бы быть в состоянии выставить только данные Vara в этом формате (без вложенной глубины ...):

{ 
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"), 
    name: 'sfdsfsdfsdfsdfsd', 
    created: "2013-06-13T12:43:25.853Z", 
    validity: "2013-07-13T12:43:25.853Z", 
    modified: "2013-06-13T12:43:25.853Z" 
} 

К сожалению, мой запрос (порога я использую проекция):

db.coll.find({}, {'details.varB': 0}) 

возвращение что-то вроде этого:

{ 
    _id: ObjectId("51b9be6dbbdeef1e5f008cca"), 
    name: 'sfdsfsdfsdfsdfsd', 
    details: { 
     varA: { 
      created: "2013-06-13T12:43:25.853Z", 
      validity: "2013-07-13T12:43:25.853Z", 
      modified: "2013-06-13T12:43:25.853Z" 
     } 
} 

Как я могу улучшить запрос поиска, чтобы вернуть ожидаемый формат?

Большое спасибо заранее для тех, кто будет помогать мне ;-)

P.S. здесь я использую оболочку mongo для извлечения данных, но мне нужно, чтобы этот запрос работал с node.js с node-mongodb-native.

+0

Я предлагаю вам подумать о том, чтобы сделать эту занятую работу на клиенте (в NodeJS), вместо того, чтобы сервер БД выполнять дополнительную работу по проектированию данных в другом формате. – WiredPrairie

ответ

5

Я сделал это только с агрегатной функцией, как описано в моем блоге here

В вашем случае, это работает

db.temp.aggregate (
    { 
     $project : 
     { 
     name:"$name", 
     created:"$details.varA.created", 
     validity:"$details.varA.validity", 
     modified:"$details.varA.modified" 
     } 
    } 
); 

или

db.temp.aggregate ({$project:{name:"$name",created:"$details.varA.created",validity:"$details.varA.validity",modified:"$details.varA.modified"}}); 

Это пример работы

> db.temp.insert ({name:'sfdsfsdfsdfsdfsd', details: { varA : { created: "2013-06-13T12:43:25.853Z", validity: "2013-07-13T12:43:25.853Z", modified: "2013-06-13T12:43:25.853Z"}, varB : { created: "2013-06-13T12:43:25.853Z", validity: "2013-07-13T12:43:25.853Z", modified: "2013-06-13T12:43:25.853Z" } } }) 
> db.temp.aggregate ({$project:{name:"$name",created:"$details.varA.created",validity:"$details.varA.validity",modified:"$details.varA.modified"}}); 
{ 
     "result" : [ 
       { 
         "_id" : ObjectId("51b9d7151723a9c4d6bc9936"), 
         "name" : "sfdsfsdfsdfsdfsd", 
         "created" : "2013-06-13T12:43:25.853Z", 
         "validity" : "2013-07-13T12:43:25.853Z", 
         "modified" : "2013-06-13T12:43:25.853Z" 
       } 
     ], 
     "ok" : 1 
} 
+0

спасибо @thefourtheye. Это то, что я искал. Есть ли способ объединить все остальные поля этого запроса? У меня есть еще 20 полей в коллекции, которые я хочу отобразить в моем результате, должен ли я перечислять их все в операторе $ project? – Michael

+0

Да. Если вы хотите сгладить или переименовать заголовок в результате запроса, вы должны указать все имена полей. – thefourtheye

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

  • Нет связанных вопросов^_^