我知道MongoDB是无模式的。但是,我有一些对象/实体的数据模型,我有一组明确定义的属性,它们将包含它们。例如,如果我有一个学生实体,我知道它的json看起来像
{
name: "string",
id: "int",
class: "string"
}
是否可以使用MongoDB定义此架构? 如果无法做到这一点,那么如何验证用户是否已发送完整集来创建新学生?
答案 0 :(得分:5)
Mongodb不是一个适用于所有问题的神奇解决方案。其中一个优点是无模式,所以如果你有完全固定模式的集合 - 那么考虑使用其他sql dbs(你将摆脱大量的开销)。
如果你真的想要定义模式 - 在vanilla mongo中不可能这样做,但是与许多流行的技术一样,有一些可用的库。其中一个允许定义模式的是Mongoose。它不是唯一的,你会发现很多类似的工具。
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var blogSchema = new Schema({
title: String,
author: String,
body: String,
comments: [{ body: String, date: Date }],
date: { type: Date, default: Date.now },
hidden: Boolean,
meta: {
votes: Number,
favs: Number
}
});
PS 如果您不想使用任何其他库,您可以在应用程序层中定义架构并在将每个文档添加到db之前验证每个文档,但在进入新技术之前,它很高兴看到它是否适合。为了使用技术而使用技术从来都不是一个好主意。
答案 1 :(得分:2)
根据定义,MongoDb是一个架构较少的数据库,因此数据库端无法验证用户是否已发送完整集。
为了实现此要求,您需要在Application层实现它,并使您的应用程序模式可识别。
答案 2 :(得分:0)
MongoDB无法验证或强制执行架构。
但是,您可以在客户端创建自己的架构验证。在您让客户端将新的JSON文档插入到学生集合之前,您可以检查该文档,它只包含包含相应数据类型的给定密钥,并在数据限制不符合时阻止插入。
此外,像Spring-Data这样的对象文档映射器(ODM)可以强制执行此类验证,具体取决于您使用的客户端(在本例中为Java)。
Mongoose可用于Node.js
答案 3 :(得分:0)
我还发现以下meteor包非常有用: https://github.com/aldeed/meteor-simple-schema
答案 4 :(得分:0)
$jsonSchema
运算符以支持使用 JSON Schema 的文档验证。$jsonSchema
运算符匹配满足指定 JSON 架构的文档。
例如:
{
$jsonSchema: {
required: [ "name", "major", "gpa", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
address: {
bsonType: "object",
required: [ "zipcode" ],
properties: {
"street": { bsonType: "string" },
"zipcode": { bsonType: "string" }
}
}
}
}
}
您可以在文档验证器中使用 $jsonSchema
在插入和更新操作中强制执行指定的架构:
db.createCollection( <collection>, { validator: { $jsonSchema: <schema> } } )
db.runCommand( { collMod: <collection>, validator:{ $jsonSchema: <schema> } } )
您可以在读写操作的查询条件中使用$jsonSchema
来查找集合中满足指定模式的文档:
db.collection.find( { $jsonSchema: <schema> } )
db.collection.aggregate( [ { $match: { $jsonSchema: <schema> } } ] )
db.collection.updateMany( { $jsonSchema: <schema> }, <update> )
db.collection.deleteOne( { $jsonSchema: <schema> } )
要在集合中查找不满足指定架构的文档,请在 $jsonSchema
表达式中使用 $nor
表达式。例如:
db.collection.find( { $nor: [ { $jsonSchema: <schema> } ] } )
db.collection.aggregate( [ { $match: { $nor: [ { $jsonSchema: <schema> } ] } }, ... ] )
db.collection.updateMany( { $nor: [ { $jsonSchema: <schema> } ] }, <update> )
db.collection.deleteOne( { $nor: [ { $jsonSchema: <schema> } ] } )