Mongoose 是一个为 Node.js 设计的 MongoDB 对象文档映射(ODM)库,它能够简化开发者操作 MongoDB 数据库的复杂性。在使用 Mongoose 时,经常需要存储包含子文档的模型数据。如果不正确使用 Mongoose,会导致数据冗余、关联性丢失等问题。本文提供正确的姿势来保存包含子文档的数据模型。
创建模型
为了让我们更好地演示,我们首先需要使用 Mongoose 创建一个包含子文档的数据模型。
-- -------------------- ---- ------- ----- -------- - -------------------- ----- --------- - --- ----------------- --------- ------ --- ----- ---------- - --- ----------------- ---------- ------- ------------ ----------- --- ----- --------- - ---------------------- ------------ -------------- - ----------
在这个例子中,我们创建了一个包含子文档的 main
模型,其中 subDocument
子文档是一个数组,它包含一个 subField
字段。
错误示范:错误地保存子文档
当我们保存包含子文档的数据模型时,可能会误用 Mongoose 的 API 导致数据丢失、冗余等问题。例如,使用以下代码保存数据。
-- -------------------- ---- ------- ----- -------- - --- ----------- ---------- ------- ------------ - - --------- ------ -- - --------- ------ - - --- --------------------------- - -- ----- ----------------- ---
然而,这种保存方式实际上是错误的,因为它在数据库中保存了多个相同的子文档,并失去了主文档与子文档关联的信息。你可以执行该查询,并使用 console.log
打印查询文档,查看查询结果。
MainModel.findOne({}).exec().then(console.log);
结果应该是:
-- -------------------- ---- ------- - ---- ------------------------- ---------- ------- ------------ - - ---- ------------------------- --------- ------ -- - ---- ------------------------- --------- ------ - - -
我们可以看到,两个子文档具有相同的 _id
值,这代表了我们在多次尝试保存子文档时的错误结果。如何修复这个问题呢?
正确的子文档保存方式
为了正确保存包含子文档的模型,我们需要使用另一种方式。我们可以通过在主模型中的数组中添加一个子文档实例来指定其父文档。这样就可以确保主文档与子文档之间的关联关系。以下是正确的子文档保存方式:
-- -------------------- ---- ------- ----- -------- - --- ----------- ---------- ------ --- ----- -------- - - --------- ------ -- ----- -------- - - --------- ------ -- ------------------------------------ ------------------------------------ --------------------------- - -- ----- ----------------- ---
请注意,现在我们将子文档实例 subData1
和 subData2
添加到 mainData
的 subDocument
数组中,指定了其父文档。这样子文档就会被正确地保存到数据库中,且每个子文档具有单独的 _id
值并与其父文档正确关联。
如果我们现在执行查询,并使用 console.log
打印它,查询结果应该是:
-- -------------------- ---- ------- - ---- ------------------------- ---------- ------- ---- -- ------------ - - ---- ------------------------- --------- ------ -- - ---- ------------------------- --------- ------ - - -
现在我们可以看到,在保存主文档和子文档后,每个子文档都具有不同的 _id
值,并正确地与其父文档 mainData
关联。
结论
如果你正在使用 Mongoose 并需要保存包含子文档的数据模型,请遵循正确的方法。我们演示了错误和正确的保存方式,并强调了正确的方法可以确保数据完整性和正确性。在编写代码时,请牢记这个方法以避免错误的结果。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671de6972e7021665ef426b4