Mongodb简单查询子文档

时间:2017-02-27 18:44:39

标签: mongodb mongoose mongodb-query

我正在尝试查询此模型:

user = {
  'email': 'test@test.com',
  'pages': [
       {
          'name': 'best page',
          'sessions': [
              {
                 sessionName: 'abc',
              },

          ]
       }, ..
  ]
};

基本上我想从一个按session._id DESC排序的页面中选择3个会话数据。

User.findOne({ '_id': userId, 'pages._id': pageId })
    .select('pages.sessions')
    .sort({ 'pages.sessions._id': -1 })
    .limit(3)
    .exec(function(err, user) {
        console.log(user);
    });

但没有任何工作......它返回的是一系列页面(而不是1)。数据未排序,并且有所有会话而不是3。

我应该改变什么?

编辑:发现我无法对其进行排序,我可以使用slice('pages.sessions')来限制它,但我怎样才能只获得1页而不是数组?

1 个答案:

答案 0 :(得分:0)

您可以使用以下aggregation

Users.aggregate([{
    $match: {
        "_id": "1",
        "pages._id": "1"
    }
}, {
    $project: {
        _id: 1,
        email: 1,
        pages: {
            $filter: {
                input: '$pages',
                as: 'pages',
                cond: { $eq: ['$$pages._id', "1"] }
            }
        }
    }
}, {
    $unwind: "$pages"
}, {
    $project: {
        _id: 1,
        email: 1,
        pages: {
            _id: 1,
            name: 1,
            sessions: {
                $slice: ["$pages.sessions", 3]
            }
        }
    }
}], function(err, user) {
    console.log(user);
})

首先$match您的文档需要_id / pages._id,然后filter pages数组取决于pages._id。然后$unwind pages可以在下一个projectslices