標籤:operator 哈哈 emma _id comm mongo 添加 原因 直接
簡單的投影
稍微用過MongoDB的都知道,投影很簡單,就直接
db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)},{comments: 1})
添加$slice的投影
然而,當我要給comments分頁($slice)如何做呢?
錯誤的做法
以下給出了錯誤的做法
db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)},{comments: 1, comments:{$slice:[0,1]}})
這樣寫的話,就只有分頁,然後欄位顯示全部。
原因:
對象中,同名欄位,後者會覆蓋前者。所以{comments: 1, comments: {$slice:[0,1]}}中實際生效的只有comments:{$slice:[0,1]}。
同理,如果兩個調換位置變成{comments: {$slice:[0,1]}, comments: 1},那麼實際生效的就是comments: 1,沒有分頁。
正確的寫法
$elemMatch,可以做到
db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)}, {comments:{$slice:[0,1]}, $elemMatch:1})
對於$elemMatch,官網文檔也沒有說明此用法。所以我也不知道這個算不算歪門邪道吧哈哈。
有其他更優雅的寫法,求告知
spring中如何用
在spring中,Query的拼裝如下。要用正常的include去寫。
Query query = new Query();query.addCriteria(Criteria.where("_id").is(new ObjectId("5a5085aed8f10c1a6cc0395b")));query.fields().slice("comments", 0, 1);query.fields().include("$elemMatch");
錯誤的拼法
query.fields().slice("comments", 0, 1).elemMatch("comments", new Criteria());
這樣拼完會變成
db.student.find({_id:ObjectId(‘5a5085aed8f10c1a6cc0395b‘)}, {comments:{$slice:[0,1]}, $elemMatch: {}})
而這個語句在MongoDB直接執行的話會報錯
MongoDB投影有$slice如何只顯示該欄位