如何在mongoose中排序,选择和查询子文档

时间:2014-09-19 11:17:10

标签: node.js mongodb mongoose aggregation-framework

所以我试图对子文档进行排序,但也选择了一切。我似乎无法使用常规查询,所以我尝试了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);
    });
  })
});

这几乎可以工作:

[ { _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' pluck但是有没有办法只使用mongodb?

1 个答案:

答案 0 :(得分: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' } ]