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
数据数组,不需要为其定义架构。
我环顾四周,没有看到任何明显的这个问题的答案;对不起,如果有,我错过了。
所以我现在有一个常规的 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
数据数组,不需要为其定义架构。