节点JS / Mongo插入时没有匹配的模式

时间:2015-01-05 04:38:47

标签: javascript node.js mongodb mongoose mongodb-query

我一直在四处寻找并且没有看到这个问题的任何明显答案;对不起,如果有,我错过了。

所以我现在有一个常规的NodeJS + Mongo堆叠,它一般都在工作。

我正在使用这样的模式(为了这个问题而简化):

var ObjSchema = new Schema({
    name: {
        type: String,
        default: '',
        trim: true
    },
    description: String,
    images: [ImageSchema],
    ...
});

现在,我不想在数据库中制作与ImageSchema匹配的实际图像,而根据this,您可以显然将文档插入到数据库中,即使它们没有&#39 ; t匹配集合架构。因此,出于测试目的,我只是在插入时插入一个URL列表(手动,再次用于测试目的),而不是与ImageSchema匹配的对象列表。

在交互式mongo shell中,我完成了相同的操作:

db.objects.insert( { name: "Object", description: "My Collection", images: ["http://www.blah.com/img.jpg", "http://foo.com/another.jpg"]... })

交互式mongo shell告诉我这很好,并且给了我"插入db"爵士乐。当我执行db.objects.find()时,BSON在我输入时正确显示,并带有一个' images'的字符串列表。而不是与指定的ImageSchema匹配的东西。

现在,这就是问题所在。我在Node中执行完全相同的命令而不是交互式shell,我得到的BSON对象相当于:

{ 
    _id: 54a9ede2da41c93989d3258d,
    description: 'My Collection',
    images:[], // THIS IS THE PROBLEM
    name: 'Object'
}

正如你所看到的,其他领域都很好;搜索正在检索对象,并且所有与模式匹配的字段都可以。但是,在节点搜索中,此文档的images属性是一个空列表,而db.objects.find()给出了我为测试目的而插入的URL列表。

发生了什么?知道在使用Node拉动时如何获取图像属性中的URL?

我使用的命令相当于:

Object.find({'name': 'object'}, function(err, obj) {

我正在使用console.log(obj)。

1 个答案:

答案 0 :(得分:1)

这里非常简短的案例是MongoDB是"无模式"但是Mongoose作为ODM层不是。它旨在强制执行模式规则,例如类型和期望字段。

如果您要添加与架构不匹配的数据,您可以随时使用strict选项,如下所示:

var ObjSchema = new Schema({
    name: {
        type: String,
        default: '',
        trim: true
    },
    description: String,
    images: [ImageSchema],
    ...
},{ "strict": false }); // Last line is important here

但实际上考虑到您的样本数据,这仅仅涉及子文档数组如何只是字符串。使用"架构"对于数组元素,您可以通过模式创建中的类似属性省略所需的"_id"值:

var ImageSchema = new Schema({
    "url": String
},{ "_id": false });

var ObjSchema = new Schema({
    name: {
        type: String,
        default: '',
        trim: true
    },
    description: String,
    images: [ImageSchema],
    ...
},{ "strict": false }); // Last line is important here

这对于以下数据是可以的:

[{ "url": "http://www.blah.com/img.jpg" }, { "url": "http://foo.com/another.jpg" }]

但是对于纯字符串,那么只需定义一个没有模式定义的String类型:

var ObjSchema = new Schema({
    name: {
        type: String,
        default: '',
        trim: true
    },
    description: String,
    images: [String],
    ...
},{ "strict": false }); // Last line is important here

因此,选择您需要的内容,但对于您提供的数据,这只是一个String数据数组,不需要为其定义模式。