问题标签 [mongoose-schema]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
node.js - 一对多 Mongoose 关系 - 存储参考的位置
我正在为一个新项目设计 MongoDB 集合架构,作为 MongoDB 新手,我有一个关于一对多关系的问题。
为了这个例子,假设关系是数据中心到服务器,这意味着一个数据中心可以有多个服务器(数千个,在应用程序中不限于),服务器只能属于一个数据中心。
最好有Servers._datacenter
参考Datacenter._id
?还是存储服务器 ID 的Datacenter.servers
数组?
如果您建议在数据中心文档中使用一个数组来引用与其关联的服务器 ID……那么当您只有服务器 ID 时,有没有办法找出服务器所属的数据中心?(有点像快速where serverId in Datacenter.servers
查询)无需查询每个数据中心,然后检查每个 Datacenter.servers 数组中的 ID
如果您建议在 Servers 文档中有一个元素来引用它所属的 Datacenter,那么有没有办法查询 Datacenter,并在虚拟 Documents.servers 数组或其他东西中返回所有关联的 Server 文档?
我不太确定最好的路线是什么,因为每个数据中心可能有非常大量的服务器,我认为每个数据中心文档中没有这么大的数组可能是一个更好的主意......但是那么如果我设置它以便每个服务器文档都引用了父数据中心,这会使查询变得相当困难(或者不是?也许有一个我还没有发现的非常简单的方法,我确实说我是 Mongo 的新手)
我正在阅读此文档,它显示了如何设置参考方向,并指出:
为避免可变的、不断增长的数组,请将出版商引用存储在图书文档中
所以这让我认为最好在服务器文档中引用数据中心 ID。如果是这样,有没有办法将所有服务器文档作为数据中心文档中的数组返回?或者我是否必须查询数据中心,然后查询具有该 Datacenter._id 的所有服务器,然后返回一个合并对象。
node.js - Mongoose ODM 中模型子模式中的参考项
我设置了我的 MongoDB 模型,并且我有一个模型模式(Partition
模型)设置,其中一个模式项(fields
)是遵循另一个模式(Field
模式)的项目数组
这是分区模型(带有分区架构和字段架构):
然后我有另一个模型(Asset
模型),它有一个attributes
数组,其中包含每个有两个项目的对象,_field
并且value
. _field
需要是一个 ID,它将引用分区模型值中的项目fields._id
。
这是资产模型:
我遇到问题的地方是架构_field
中的项目。Asset
我不确定我应该设置什么作为ref
值,因为它引用了一个子模式(意味着Field
模式中的Partition
模式)
我可能在文档中忽略了它,但我什么也没看到。如何引用模型子架构,所以当我在查询中填充该项目时,它会使用模型文档中的子文档填充它Partition
?
我尝试将字段文档引用为Partition.fields
,导致错误:
MissingSchemaError:尚未为模型“Partition.fields”注册架构。
我根据从另一个 SO 线程中读取的内容尝试了上述ref
值,但它似乎不起作用。
node.js - Mongoose 默认值是否适用于现有文档?
如果我将属性添加到 Mongoose 模式并为其提供默认值,现有文档在加载时会收到这些默认值吗?
node.js - 如何在 Mongoose 中处理模式迁移?
我创建了如下架构
在上面的 Location 属性中,unique:true是错误的。之后,我删除了 unique:true 并尝试添加数据,但仍然引发以下错误。
如果我想添加更多字段,如何解决这个问题以及如何处理模式?
node.js - 在 Mongoose 模式验证中执行查询
我试图以有一个projects
集合和一个people
集合的方式设置我的 MongoDB 设计。Project
模型架构包含一个_people
引用模型的项目People
。(相对于 People 模型有一个字段来引用他/她所属的项目。它需要是这样的)
每当在容器中创建新文档时,我都需要运行验证people
,即每个项目只能有一个经理。如果我可以对模式中的元素验证执行查询,这将非常容易,但我不相信这是可能的......
这是当前模型的架构People
:
正如您在isManager.validate.validator
函数中看到的那样,我注意到如果此文档isManager
设置为 true,我需要找到一种方法来检查是否没有person
同一个项目引用的文档也是经理。
知道哪个项目引用了这个文档不是问题,我会在某个地方找到它,我只需要知道如何运行查询.. 这可能吗?
node.js - 针对 Mongoose 模式验证对象而不保存为新文档
我正在尝试验证将插入到新文档中的一些数据,但不是在许多其他事情需要发生之前。因此,我将向静态方法添加一个函数,该函数有望根据模型模式验证数组中的对象。
到目前为止的代码如下:
所以这peopleSchema.statics.validatePeople
就是我试图进行验证的地方。我已经阅读了猫鼬验证文档,但它没有说明如何在不保存数据的情况下验证模型。
这可能吗?
更新
这里的一个答案向我指出了正确的验证方法,这似乎有效,但现在它抛出了一个Unhandled rejection ValidationError
.
这是用于验证数据的静态方法(不插入)
然后我测试一下:
使用不遵循架构规则的数据对其进行测试会引发错误,如您所见,我试图捕捉它,但它似乎不起作用。
PS我用 Bluebird 来兑现我的承诺
node.js - 如何访问附加到猫鼬模式的方法
在调用我正在处理的项目中附加到模式的方法时,我遇到了一些困惑。我实际上是在访问数据库中的文档,并尝试将我存储的散列密码与用户在登录时提交的密码进行比较。但是,当我尝试比较密码时,找不到我附加到模式的方法对象的方法。它甚至不会给我一个错误,告诉我没有这样的方法。这是我在架构上设置方法的地方:
我用作比较方法的函数是我创建的名为 verifyPassword 的实用程序函数,它保存在实用程序文件中。该函数的代码在这里:
我尝试像这样验证密码:
如果这有什么不同的话,我已经用蓝鸟承诺向猫鼬许诺了。我已经尝试了很多东西,但是当我尝试调用这个我认为我已经附加了架构的方法时,为什么什么也没发生,我找不到任何答案。任何帮助将不胜感激。
javascript - Mongoose 子模式不生成 _id
我有两个Schema
对象:
联系人.js:
客户端.js:
唉,当我保存Client
对象时,没有 _id 分配给已保存的Contact
.
但是当我使用这个模式时:
客户端.js:
联系人使用自动生成的 _id 保存。
我保存客户的方式非常简单:
req.body 的内容是:
我错过了什么?
mongodb - 抑制/捕获来自 Mongoose 的 ValidationError 错误
我有一个静态方法设置,它将验证对象是否正确遵循模型的模式,并且验证本身工作得很好,但我无法让 Mongoose 隐藏ValidationError
控制台中显示的错误。
验证的静态方法是:
然后当我执行它时:
就像我说的,我可以用它来验证数据,但它总是会显示这个错误:
(注意:我在我的 JS 承诺中使用 Bluebird,以防它与 then/catch 有任何关系)
脚本继续执行代码,这意味着它实际上并没有杀死脚本或任何东西,它只是将错误记录到控制台。但是由于这个函数是用来验证的,它并不是一个真正的“错误”,所以有没有办法从控制台隐藏它?(仅针对此功能,不适用于所有 Mongoose 错误)
谢谢
javascript - 使用 Mongoose 模式验证用户名
我正在尝试在将其保存到 mongodb 之前验证用户名。但是,我在终端中看到了以下消息,而不是保存或验证消息:
“ if(user.path(username)){ TypeError: user.path is not a function”
这是什么意思?我是新手。
这是我的 user.js
这是我的 login.js