【问题标题】:Node JS / Mongo inserting without matching schemaNode JS / Mongo插入没有匹配的模式
【发布时间】:2017-06-29 12:32:12
【问题描述】:

我一直在环顾四周,并没有看到任何明显的答案;抱歉,如果有,我错过了。

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

我正在使用这样的架构(为本问题的目的进行了简化):

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

现在,我不想麻烦在数据库中制作与 ImageSchema 匹配的实际图像,根据this,您显然可以将文档插入数据库,即使它们与集合模式不匹配.因此,为了测试目的,我只是在插入时放置一个 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 在我输入时正确显示,其中包含“图像”的字符串列表,而不是与指定的 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)。

【问题讨论】:

  • 你在用猫鼬吗?

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


【解决方案1】:

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

如果您想添加与架构不匹配的数据,您始终可以使用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 数据的数组,不需要为它定义架构。

【讨论】:

  • 这完全解决了我的问题。谢谢你教我Mongoose;我是自学成才的,所以你可以看到我没有考虑所有的可能性。
猜你喜欢
  • 2016-03-19
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-05-17
  • 2021-11-06
  • 2012-12-23
  • 1970-01-01
相关资源
最近更新 更多