2015-08-18 29 views
2

我無法編寫查詢來檢索Story文檔中嵌入的Comments數組的最後一個對象。如何檢索Mongoose中嵌入文檔中數組的最後一個對象?

我的收藏目前看起來是這樣的,當我db.stories.find():

{ 
"_id" : ObjectId("55d3a39565698bbc68079e31"), 
"author" : "Steven Chen", 
"link" : "COCO", 
"title" : "COCO", 
"date" : ISODate("2015-08-18T21:28:53.629Z"), 
"comments" : [ 
    { 
     "author" : "Steven", 
     "text" : "Major", 
     "_id" : ObjectId("55d3a39565698bbc68079e32"), 
     "date" : ISODate("2015-08-18T21:28:53.632Z") 
    }, 
    { 
     "text" : "Canada", 
     "author" : "Steven", 
     "_id" : ObjectId("55d3a39a65698bbc68079e33"), 
     "date" : ISODate("2015-08-18T21:28:58.001Z") 
    }, 
    { 
     "text" : "Usa", 
     "author" : "Steven", 
     "_id" : ObjectId("55d3a39c65698bbc68079e34"), 
     "date" : ISODate("2015-08-18T21:29:00.877Z") 
    } 
], 
"__v" : 0 
} 

我想找回根據給定的故事文檔的_id日最後一個註釋。

我的代碼的上下文是有一個Story帖子和一個註釋列表,我想檢索最後一個註釋並將它作爲JSON發送到我的客戶端JS,使用ajax,因此視圖可以更新爲最新/最新評論。

在這種情況下,用「文字:‘註釋美國’應該是一個越來越檢索

有人可以提供適當的方式來做到這一點,它甚至會更好,如果你能解釋一下爲什麼要感謝?你!

回答

10

你的「最新」的文件將永遠在你的數組的末尾,除非你修改莫名其妙。將項目添加到陣列,使用時將始終轉到「結束」或「追加」現有項目$push操作符或在客戶端代碼中使用數組操作方法添加。

只有像$addToSet這樣的運營商或明確使用$push運營的修改符纔會更改此操作。

因此,當在一個數組的結尾,你通常需要做的是用$slice,具有負指數從數組的「結束」得到物品:

Model.findById("55d3a39565698bbc68079e31") 
    .select({ "comments": { "$slice": -1 }}) 
    .exec(function(err,doc) { 

    }) 

如果您實際上已經修改了前面提到的最近日期不是數組中最後一個元素的數組,那麼您應該在更新上使用$sort修飾符。如果您要求修改器$position或者您使用了$addToSet,它通常只會「不合適」。該$position是故意的,你也不能排序,但你可以在陣列的$addToSet操作這樣的,哪個地方承滴盤的日期,以便在不改變陣列中的任何其他內容後總是排序:

Model.findByIdAndUpdate("55d3a39565698bbc68079e31", 
    { "$push": { "comments": { "$each": [], "$sort": { "date": 1 } } } } 
) 

隨着數組修改相同$slice操作適用於查詢,因爲數組現在按日期排序。

然而,如果你的目的是留在你的文件排列出順序,或者你想要的其他命令,但你也想獲得最新的日期,那麼你可以使用.aggregate()$sort和檢索$last數組項:

Model.aggregate(
    [ 
     { "$match": { "_id": ObjectID("55d3a39565698bbc68079e31") } }, 
     { "$unwind": "$comments" }, 
     { "$sort": { "comments.date": 1 } }, 
     { "$group": { 
      "_id": "$_id", 
      "author": { "$first": "$author" }, 
      "link": { "$first": "$link" }, 
      "title": { "$first": "$title" }, 
      "date": { "$first": "$date" }, 
      "comments": { "$last": "$comments" } 
     }} 
    ] 
) 

注意到,當使用具有貓鼬的聚合框架的情況下,_id「autocasting」這種情況發生在其他的查詢不會發生(這是由設計),因此,有必要強制轉換爲ObjectId值自己,如果數據不在該表單中並且以字符串形式出現。

這些是您從數組中獲取最後一個元素(可選地顯式排序)的方法。

+0

謝謝先生!我不知道我必須使用$ slice來過濾數組。感謝您對聚合和修改的額外解釋。這是一個巨大的幫助! –

+0

非常翔實的答案就像一個魅力:) –

相關問題