2017-02-27 68 views
1

我试图查询这个模型MongoDB的简单quering:与子文档

user = { 
    'email': '[email protected]', 
    'pages': [ 
     { 
      'name': 'best page', 
      'sessions': [ 
       { 
       sessionName: 'abc', 
       }, 

      ] 
     }, .. 
    ] 
}; 

基本上我想从session._id降序排序的一个页面中,选择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页,而不是数组?

回答

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,则根据pages._idfilterpages阵列。然后$unwindpages在接下来的project能够slices

+0

返回空数组,但我会看看聚合。谢谢。 – dontHaveName

+0

使用mongoose.Types.ObjectId(userId,pageId)解决了它。你也知道如何从我编辑的问题中得到1个结果(我想只使用简单查询+ slice()对性能更好)? – dontHaveName

+0

你是什么意思1页/结果?你能展示你的预期产出吗? –