2014-09-19 2 views
2

Так что я пытаюсь сортировать поддокумент, но также выбираю и все. Кажется, я не могу с обычным запросом, поэтому я попытался ж/aggregateКак сортировать, выбирать и запрашивать поддокумент в mongoose

mongoose = require("mongoose"); 
mongoose.connect("localhost:27017", function(err) { 
    mongoose.connection.db.dropDatabase(); 
    Story = mongoose.model("Story", { 
    title: String, 
    comments: [{ 
     author: String, 
     content: String 
    }] 
    }); 
    sample = new Story({ 
    title: "Foobar", 
    comments: [ 
    { 
     author: "A author", 
     content: "1 Content" 
    }, 
    { 
     author: "B author", 
     content: "2 Content" 
    } 
    ] 
    }); 
    sample.save(function(err, doc) { 
    Story.aggregate([ 
     { $match: { 
      _id: doc._id 
     }}, 
     { $unwind: "$comments" }, 
     { $project: {"comments": 1}}, 
     { $sort: {"comments.author": -1}} 
    ], function (err, result) { 
     if (err) { 
      console.log(err); 
      return; 
     } 
     console.log(result); 
    }); 
    }) 
}); 

Это почти работа:

[ { _id: 541c0f8098f85ac41c240de4, 
    comments: 
    { author: 'B author', 
     content: '2 Content', 
     _id: 541c0f8098f85ac41c240de5 } }, 
    { _id: 541c0f8098f85ac41c240de4, 
    comments: 
    { author: 'A author', 
     content: '1 Content', 
     _id: 541c0f8098f85ac41c240de6 } } ] 

Но то, что я хотел:

[ { author: 'B author', 
    content: '2 Content', 
    _id: 541c0f8098f85ac41c240de5 }, 
{ author: 'A author', 
    content: '1 Content', 
    _id: 541c0f8098f85ac41c240de6 } ] 

я мог используйте lodash's pluck, но есть ли способ сделать это только с mongodb?

ответ

2

Вы можете изменить ваш $project также изменить форму вывода, чтобы обеспечить структуру, которую вы ищете:

Story.aggregate([ 
    { $unwind: "$comments" }, 
    { $project: { 
     author: '$comments.author', 
     content: '$comments.content', 
     _id: '$comments._id' 
    }}, 
    { $sort: {author: -1}} 
], function (err, result) { ... 

Выход:

[ { _id: 541c2776149002af52ed3c4a, 
    author: 'B author', 
    content: '2 Content' }, 
    { _id: 541c2776149002af52ed3c4b, 
    author: 'A author', 
    content: '1 Content' } ] 
+0

работает большое спасибо! Есть ли способ сделать это автоматически? Без указания полей? – Vinz243

+0

@ Vinz243 Нет, вам нужно индивидуально назвать каждое поле в проекции, потому что вы хотите их на верхнем уровне. – JohnnyHK

+0

Я вижу, спасибо! – Vinz243

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