【发布时间】:2016-02-09 05:39:13
【问题描述】:
我目前正在使用 Mongoose ODM 在 NodeJS 应用程序中管理与 MongoDB 的数据库连接,并在 Mocha 测试中使用 Mockgoose 拦截连接。我遇到了一个问题,即在对文档执行更新时忽略了我的唯一索引。我只是用另一个名为 Mongoose-bird 的包来包装 Mongoose,它只是允许使用 Promise。
一个特别的模式如下:
// Gallery.js
'use strict';
var mongoose = require('mongoose-bird')(require("mongoose"));
var Schema = mongoose.Schema;
var ObjectId = Schema.Types.ObjectId;
var deepPopulate = require('mongoose-deep-populate')(mongoose);
var GallerySchema = new Schema({
_id: ObjectId,
type: String,
title: String,
slug: String,
_albums: [{
type: ObjectId,
ref: 'Albums'
}]
});
GallerySchema.index({ slug: 1 }, { unique: true });
GallerySchema.plugin(deepPopulate, {});
mongoose.model('Galleries', GallerySchema);
在测试中从我的控制器调用Gallery.update(conditions, data, opts) 时,故意将slug 设置为另一个的副本,它会更新文档,然后我最终得到两个具有相同slug 路径的文档。
仅供参考,我已经通过使用 save() 函数找到了解决此问题的方法,它似乎毫无问题地遵守唯一索引。
但是,由于我更喜欢使用 update() 而不是 save()(即每次更新部分文档而不是整个文档),我很想知道是否有其他人遇到过同样的问题并且你是怎么克服的?
该应用程序遵循基于 MEAN.js 的标准 MVC 模式,因此它不仅仅是一个模型,但如果我遗漏了任何可能有用的内容,请告诉我。
更新
在查看了 Mockgoose NPM 模块的源代码后,我可以确认在运行 update() 时从未执行过针对模式的验证。这里记录了一个问题:http://www.github.com/mccormicka/Mockgoose/issues/58
【问题讨论】:
-
你能用
db.galleries.getIndexes()的shell输出更新你的问题吗? -
当我回到我的工作站时,我会更新它。但是,我使用的是拦截 Mongoose 连接的 Mockgoose,因此它不与实际数据库通信,而只是它创建的内存中的数据库。
-
好吧,那没关系;我没有发现这是一个 Mockgoose 问题。
-
一切顺利!我担心这可能是数据库本身的问题,但通过 Mongo CLI 更新确实会引发约束错误。我确定数据库工作正常,我认为这可能是一个 Mockgoose 错误,但我尚未确定是否是或者我做错了什么。
标签: javascript node.js mongodb mongoose