可以在MongoDB中定义模式吗?

时间:2015-04-16 09:13:12

标签: mongodb

我知道MongoDB是无模式的。但是,我有一些对象/实体的数据模型,我有一组明确定义的属性,它们将包含它们。例如,如果我有一个学生实体,我知道它的json看起来像

{
  name: "string",
  id: "int",
  class: "string"
}

是否可以使用MongoDB定义此架构? 如果无法做到这一点,那么如何验证用户是否已发送完整集来创建新学生?

5 个答案:

答案 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)

MongoDB 3.6(2017 年发布)添加了 $jsonSchema 运算符以支持使用 JSON Schema 的文档验证。

MongoDB docs reference

$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> } ] } )