【发布时间】:2018-07-12 14:33:06
【问题描述】:
我有一个从具有子结构的模式定义的 Mongoose“用户”模型,以表示用户的选项/首选项。
当我实例化模型并在节点调试器中检查它时,它具有在子结构的每个级别重复的顶级用户属性,如姓名、电子邮件、create_date 等。
事实上,它似乎具有上一层的所有属性,添加到子结构的每一层。例如“选项”在“助手”和“默认”下重复。
该程序运行良好,因为每个级别的定义属性都在那里,但是它周围有很多垃圾,这让我担心我设置错了,它使用了过多的内存,奇怪地递归并可能导致奇怪问题。
例如稍微简化的版本:
'use strict';
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema({
name: String, // full name
create_date: Date, // signup date
email: String, // email == username
password: String, // hashed password
options: {
assistants: {
default: {
enabled: Boolean, // Turn assistant on
},
},
.... (other settings)
},
});
module.exports = mongoose.model('User', UserSchema);
稍后我通过 ID 获取用户:
const userModel = require(modelDir+'/user');
userModel.findById(userId (err, user)=>{
// adjust user.options from GUI input, then re-save
user.save((err)=>{
... etc
}
}
在节点调试器中,从数据库中获取的用户显示如下:
user:model
$__: internalCache{...}
$init: true
create_date: (...)
email: (...)
errors: undefined
id: (...)
isNew: false
name: (...)
options: model
$init: true
assistants: model
$init: true
create_date: undefined
default: model
$init: true
assistants: undefined
create_date: undefined
email: undefined
enabled: false <= the only real property!
id: undefined
name: undefined
options: undefined
... etc
email: undefined
id: undefined
name: undefined
options: undefined
password: undefined
...etc
$__: internalCache{...}
$__isNested: true
email: undefined <= these ones are greyed-out
id: undefined
name: undefined
options: undefined
password: undefined
如果我从 mongo shell 中获取它,它看起来和我预期的一样,所以它与它的保存方式无关。
{
"_id": ObjectId("5a6bdbf29c297d0eccb702ec"),
"name": "Mr Test",
"email": "...",
"password": "...",
"options": {
"assistants": {
"default": {
"enabled": true
}
},
// other stuff removed...
},
"__v": 1
}
我是否为使用子结构而错误地创建了 Mongoose 架构?
"mongoose": {
"version": "4.11.12",
$ mongod --version
db version v3.6.2
$ node -v
v9.4.0
【问题讨论】:
-
如何获取用户? (代码行)您在此处发布的
user:model似乎是 Model 而不是特定结果。 -
我已经更新了问题 - 它是通过 findById。
标签: node.js mongodb mongoose mongoose-schema