在MongoDB文档子文档数组中插入和返回子文档的ID

时间:2016-07-26 18:39:07

标签: mongodb mongoose

我的node.js应用程序会将子文档插入到以下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-"
}

我使用以下Mongoose代码添加子文档:

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);
});

subject 子文档被添加到performance子文档数组中,该子文档数组本身嵌套在scores子文档数组中。请注意,新插入的子文档被分配了自己的ID,由定义的模式创建。即使我收回整个文档,这也不是很有帮助。我特别需要新插入的子文档的ID。这个问题的推荐方法是什么?

3 个答案:

答案 0 :(得分:3)

有一个很好的解决方案,尝试使用MongooseArrays的方法createpush

在您的代码中,您可以返回Student并执行以下操作:

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

if (updatedStudent) return newPerformance._id;

这只是一个简单的例子。

使用MongooseArrays的create方法link for doc,mongoose将创建一个_id并执行所需的所有验证和强制转换,因此如果保存过程很好,则创建的子文档您可以使用_id方法获得的子文档的create

答案 1 :(得分:2)

在这种情况下,我更喜欢将ID预先分配给子文档(例如sub._id = ObjectId()或使用uuid包,如果您更喜欢uuid):清晰且可预测。

还要记住,如果您经常通过subdoc id进行查询,则可以在集合中添加(使用ensureIndex())此用例的索引。

答案 2 :(得分:0)

<块引用>

你可以这样做,使用python

from bson.objectid import ObjectId
print(ObjectId())


{
"order_id": ObjectId(),
}
<块引用>

输出

6112cf4949b0feb262330a86