2017-02-27 64 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頁/結果?你能展示你的預期產出嗎? –