常见问题¶
当我直接更新数组元素时,为什么不更改?
答案
Mongoose不会为数组索引创建getter/setter; 没有他们猫鼬从来没有得到通知的变化,所以不知道坚持新的价值。 解决方法是使用 Mongoose> = 3.2.0 中的MongooseArray#set。
我定义模式属性为“unique”,但我仍然可以保存了重复数据,是什么导致的?
答案
Mongoose本身并不处理unique
:{name:{type:String,unique:true}}
只是在name
上创建一个[MongoDB唯一索引]的简写2 例如,如果MongoDB在name
上没有唯一的索引, 尽管“unique”是真实的,但下面的代码不会出错。
var schema = new mongoose.Schema({
name: { type: String, unique: true }
});
var Model = db.model('Test', schema);
Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
console.log(err);
});
然而, 如果您使用Model.on('index')
事件等待索引建立,尝试保存重复将会抛错
var schema = new mongoose.Schema({
name: { type: String, unique: true }
});
var Model = db.model('Test', schema);
Model.on('index', function(err) {
assert.ifError(err);
Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
console.log(err);
});
});
Model.init().then(function() {
assert.ifError(err);
Model.create([{ name: 'Val' }, { name: 'Val' }], function(err) {
console.log(err);
});
});
MongoDB坚持索引, 所以你只需要重新建立索引,如果你开始一个新的数据库,或者你运行db.dropDatabase()
。在生产环境中, 你应该[使用MongoDB shell])()创建索引,而不是依靠猫鼬为你做。 模式的unique
选项方便开发和文档化,但猫鼬不是索引管理解决方案
当我在模式中有一个嵌套属性时,mongoose默认添加空对象,为什么?
var schema = new mongoose.Schema({
nested: {
prop: String
}
});
var Model = db.model('Test', schema);
console.log(new Model());
答案
这是一个性能优化 这些空的对象不会保存到数据库中, 也不是在结果toObject()
中, 除非关闭minimize
选项,否则它们不会出现在JSON.stringify()
输出中。
这种行为的原因是Mongoose的变化检测和getter / setter是基于Object.defineProperty()
。为了支持对嵌套属性的更改检测,而不会在每次创建文档时招致运行Object.defineProperty()的开销, mongoose在模型编译时定义Model
原型的属性。,由于猫鼬需要为nested.prop
定义getter和setter, 必须始终将“嵌套”定义为猫鼬文档上的对象, 即使nested
在底层的POJO上是未定义的。
我在virtual,getter/setter或method使用箭头函数,this的值是为什么是错误的?
答案
箭头函数处理this
关键字与传统函数大不相同. Mongoose getter/setter依赖this
来让你访问你正在写的文档,但是这个功能不能使用箭头函数。 除非不打算访问getter/setter中的文档,否则不要使用箭头函数来取得 Mongoose getter/setter。
我有一个名为type
的嵌入式属性是这样的:
但mongoose给了我一个CastError提示,当我试图用一个asset
对象来保存Holding
时,它不能把一个对象转换成一个字符串。
为什么不能对日期对象(例如date.setMonth(1);
)进行就地修改?
答案
Mongoose目前不会监视日期对象的就地更新,如果您需要这个功能,请随时在此GitHub问题上讨论。,有几个解决方法:
我在下面的代码中填充数组下的嵌套属性:
.populate({path:'arr.child',options:{sort:'name'}})
不会被arr.child.name
排序
答案
见这个GitHub问题。,这是一个已知的问题,但是这是一个非常难以解决的问题
我的模型上的所有函数调用挂起,我做错了什么?
答案
默认情况下,mongoose会缓冲你的函数调用,直到它可以连接到MongoDB。,阅读连接文档的缓冲部分了解更多信息。
我的save()
回调从不执行。 我究竟做错了什么?
我应该为每个数据库操作创建/销毁一个新的连接吗?
答案
不用。在应用程序启动时打开连接,并保持打开状态,直到应用程序关闭。
为什么我得到"OverwriteModelError: Cannot overwrite .. model once compiled" 当我使用nodemon(一个测试框架)?
答案
mongoose.model('ModelName',schema)'要求
ModelName是唯一的,
所以你可以通过使用
mongoose.model('ModelName')来访问模型。
如果你把mongoose.model('ModelName',schema);
放在mochabeforeEach()
hook中,
此代码将尝试在每测试之前创建一个名为“ModelName”的新模型, 所以你会得到一个错误。
确保你只用一个给定的名字once创建一个新的模型。
如果您需要创建具有相同名称的多个模型,请创建一个新的连接并将模型绑定到连接。
要添加的东西?