【问题标题】:Insert and return ID of sub-document in MongoDB document sub-document array在MongoDB文档子文档数组中插入并返回子文档ID
【发布时间】:2023-04-05 04:34:01
【问题描述】:

我的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。解决此问题的推荐方法是什么?

【问题讨论】:

标签: mongodb mongoose


【解决方案1】:

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

还请记住,如果您经常通过子文档 ID 进行查询,最好在集合中添加(使用 ensureIndex())此用例的索引。

【讨论】:

  • @Dano,我最终将'_id' : new ObjectID(), 添加到要插入的子文档中,所以 MongoDB 使用了它。我很欣赏索引上的提示。是的,我会经常查询,所以我会在集合中添加一个索引。
  • 有什么方法可以让'_id' : new ObjectID(), 在 mongo Shell 中工作?
  • 所以如果你明确地将对象_id分配给子文档,这个_id不会被自动索引,查询会很慢,对吧?
  • 当然,不!索引不依赖于值是否自动生成。您可以使用 ObjectID、UUID、ULID、整数或任何您想要的。但是你需要ensureIndex就可以了。
【解决方案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 的 create 方法 link for doc,mongoose 将创建一个 _id 并进行所需的所有验证和强制转换,因此如果保存过程正常,您可以使用创建的子文档 @您使用create 方法获得的子文档的987654328@。

【讨论】:

  • 我对 MongooseArrays 不熟悉。这是我需要进入项目的单独库吗?我注意到 ES6 结构与 const 和 await 的这种使用。如果我从过去的阅读中没记错的话,那是生成器功能的一部分。
  • 这是猫鼬的一部分,请参阅我放置的文档链接。我只是使用 es6 来更容易理解示例,这不是义务。
  • 不客气。今天我正在做一个项目,我正在使用猫鼬,几天前我也遇到了同样的情况。
  • 这是最新猫鼬版本的最正确答案。
猜你喜欢
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 2021-06-17
  • 2018-01-26
相关资源
最近更新 更多