Vinz243
Vinz243

Reputation: 9938

How to sort, select and query subdocument in mongoose

So I'm trying to sort subdocument, but also select and everything. It seems I can't with a regular query so I tried w/ aggregate

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);
    });
  })
});

This almost work:

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

But what I'd like:

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

I could use lodash's pluck but is there a way to do it only with mongodb?

Upvotes: 2

Views: 2635

Answers (1)

JohnnyHK
JohnnyHK

Reputation: 311835

You can change your $project to also reshape the output to provide the structure you're looking for:

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

Output:

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

Upvotes: 2

Related Questions