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

Node JS / Mongo inserting without matching schema

我环顾四周,没有看到任何明显的这个问题的答案;对不起,如果有,我错过了。

所以我现在有一个常规的 NodeJS + Mongo 堆栈,它运行正常。

我正在使用这样的架构(针对此问题进行了简化):

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

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

在交互式 mongo shell 中,我完成了相当于:

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

交互式 mongo shell 告诉我这很好,并给了我 "Inserted into db" 爵士乐。当我执行 db.objects.find() 时,BSON 在我输入时正确显示,其中包含 'images' 的字符串列表,而不是与指定的 ImageSchema 匹配的内容。

问题来了。我在 Node 中执行了完全相同的命令而不是交互式 shell,我得到的 BSON 对象等效于此:

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

如您所见,其他字段没问题;搜索正确地检索了对象,并且所有与模式匹配的字段都没有问题。但是,在节点搜索中,该文档的图像属性是一个空列表,而 db.objects.find() 给出了我为测试目的插入的 URL 列表。

这是怎么回事?知道在使用 Node 拉取时如何获取图像属性中的 URL 吗?

我使用的命令相当于:

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

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

这里非常简短的情况是 MongoDB 是 "schemaless" 但作为 ODM 层的 Mongoose 不是。它旨在强制执行架构规则,例如类型和预期字段。

如果您想添加与架构不匹配的数据,您始终可以使用 strict 选项,如:

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

但实际上考虑到您的示例数据,这仅在子文档数组的关注方式上有所不同,其中这些只是字符串。对数组元素使用 "schema",您可以在模式创建时通过类似的 属性 省略所需的 "_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 数据数组,不需要为其定义架构。