2016-07-26 108 views
1

我的node.js應用程序會將子文檔插入到下面的MongoDB文檔的嵌套子文檔數組字段中,並且需要確定ID新插入的子文件:在MongoDB文檔子文檔數組中插入並返回子文檔的ID

{ 
    "_id" : ObjectId("578d5a52cc13117022e09def"), 
    "name" : "Grade 5 - Section A", 
    "scores" : [{ 
    "studentId" : ObjectId("5776bd36ffc8227405d364d2"), 
    "performance" : [{ 
     "_id" : ObjectId("57969b8fc164a21c20698261"), 
     "subjectId" : ObjectId("577694ecbf6f3a781759c54a"), 
     "score" : 86, 
     "maximum" : 100, 
     "grade" : "B+" 
    }] 
    }] 
} 

子文件看起來是這樣的:

{ 
    "subjectId" : ObjectId("5776ffe1804540e29c602a62"), 
    "score" : 74, 
    "maximum" : 100, 
    "grade" : "A-" 
} 

我使用下面的代碼貓鼬添加子文檔:

Class.update({ 
    _id: '578d5a52cc13117022e09def', 
    'scores.studentId': '5776bd36ffc8227405d364d2' 
}, { 
    $addToSet: { 
    'scores.$.performance': { 
     'subjectId' : '5776ffe1804540e29c602a62', 
     'score' : 74, 
     'maximum' : 100, 
     'grade' : 'A-' 
    } 
    } 
}, function(err, result) { 
    if (err) { 
    throw err; 
    } 
    console.log(result); 
}); 

受試者子文檔獲取performance子文檔陣列本身是嵌套在scores子文檔陣列中加入。請注意,新插入的子文檔被分配了自己的ID,由定義的模式制定。即使我拿回整個文件,這也不是很有幫助。我特別需要該新插入的子文檔的ID。對這個問題推薦的方法是什麼?

+0

相關http://stackoverflow.com/questions/18760087/find-id-of-latest-subdocument-inserted-in-mongoose – chridam

回答

2

在這種情況下,我更願意將ID預先分配給子文檔(即sub._id = ObjectId()或使用uuid軟件包,如果您更喜歡uuid):清晰可預測。

另外請記住,如果您經常通過subdoc ID進行查詢,可以在集合中爲此用例添加一個索引(使用ensureIndex())。

+0

@Dano,我結束了添加'_id':new ObjectID(),'到要插入的子文檔,所以MongoDB使用它。我很欣賞指數上的領頭。是的,我會經常查詢,所以我會在集合中添加一個索引。 –

+0

有什麼辦法可以使'_id':new ObjectID(),'在mongo Shell中工作嗎? –

+0

所以如果你明確地指定對象_id到一個子文檔,這個_id將不會被自動索引,並且查詢會很慢,對吧? – Saitama

2

有一個很好的解決方案,嘗試使用MongooseArrays的方法createpush

在你的代碼可能會返回Student,做這樣的事情:

const newPerformance = student.performance.create(newData); 
student.performance.push(newPerformance); 
const updatedStudent = await student.save(); 

if (updatedStudent) return newPerformance._id; 

這只是一個簡單的例子。

使用MongooseArrays,link for doccreate方法,貓鼬將創建一個_id,做所有的驗證且將其需要,因此,如果保存過程是精細的創建子文檔,你可以只用你得到的子文檔的_idcreate方法。

+0

我對MongooseArrays不熟悉。這是我需要在項目中需要的獨立庫嗎?我注意到這個使用const和等待的ES6結構。如果我從過去的閱讀中正確記得,那是發電機功能的一部分。 –

+1

這是貓鼬的一部分,請參閱我放置的文檔鏈接。我只是用es6來更容易理解這個例子,這不是一個義務。 –

+0

謝謝,很高興知道! –