2016-07-26 105 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

谢谢,很高兴知道! –