我一直在四处寻找并且没有看到这个问题的任何明显答案;对不起,如果有,我错过了。
所以我现在有一个常规的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)。
答案 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
数据数组,不需要为其定义模式。