MongoDB:如何定义架构?

时间:2013-06-08 11:20:52

标签: mongodb

所以我有一个使用MongoDB作为数据库的应用程序。该应用程序使用了一些集合。

何时以及如何定义数据库的“模式”,包括设置所有集合以及所需的索引?

AFAIK,你无法在MongoDB中定义空集合(如果我错了,请纠正我,如果我能做到这一点,它基本上会回答这个问题)。我应该为每个集合插入一个虚拟值并使用它来设置我的所有索引吗?

最佳做法是什么?

7 个答案:

答案 0 :(得分:10)

您不在MongoDB中创建集合 您只需立即开始使用它们是否“存在”。

现在定义“架构”。正如我所说,你刚开始使用一个集合,所以,如果你需要确保一个索引,那就继续这样做吧。没有集合创建。首次修改时会有效地创建任何集合(创建索引计数)。

> db.no_such_collection.getIndices()
[ ]
> db.no_such_collection.ensureIndex({whatever: 1})
> db.no_such_collection.getIndices()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "ns" : "test.no_such_collection",
                "name" : "_id_"
        },
        {
                "v" : 1,
                "key" : {
                        "whatever" : 1
                },
                "ns" : "test.no_such_collection",
                "name" : "whatever_1"
        }
]

答案 1 :(得分:6)

创建空集合

首先,这是如何使用内置交互式终端在MongoDB中创建空集合,这样就可以了,

db.createCollection('someName'); // create empty collection

只是你没有必要,因为有人说过,一旦你开始与数据库交互,他们将实时创建。

MongoDB是无架构的故事结束但......

您可以创建自己的类,与mongo数据库进行交互。在该类中,您可以定义必须满足的规则,然后才能将数据插入到mongo集合中,而不是其他明智的自定义异常。

或者如果您使用node.js服务器端,您可以安装 mongoose 节点包,它允许您以OOP样式与数据库进行交互(为什么还要重新发明轮子,对吧?)。

  

Mongoose为模型提供了一种直接的,基于模式的解决方案   你的申请数据。它包括内置式铸造,验证,   查询构建,业务逻辑钩子等等,开箱即用。

docs: mongoose npm安装和基本用法 https://www.npmjs.com/package/mongoose mongoose完整文档http://mongoosejs.com

Mongoose使用示例(定义模式和插入数据)

var personSchema = new Schema({
    name: { type: String, default: 'anonymous' },
    age: { type: Number, min: 18, index: true },
    bio: { type: String, match: /[a-zA-Z ]/ },
    date: { type: Date, default: Date.now },
});

var personModel = mongoose.model('Person', personSchema);
var comment1 = new personModel({
    name: 'Witkor',
    age: '29',
    bio: 'Description',
});

comment1.save(function (err, comment) {
    if (err) console.log(err);
    else console.log('fallowing comment was saved:', comment);
});

Bla bla bla ...

能够在我们的代码中设置模式以及限制并不会改变MongoDB本身无模式的事实,这在某些情况下是现实的优势。这样,如果您决定对架构进行更改,但是您不需要考虑向后兼容性,只需在脚本中编辑架构即可完成。这是mongodb背后的基本思想,能够在同一集合中存储每个文档中的不同数据集。但是,总是希望在代码库逻辑中有一些限制。

答案 2 :(得分:2)

const mongoose = require("mongoose");
const RegisterSchema = mongoose.Schema({
  username: {
    type: String,
    unique: true,
    requied: true,
  },
  email: {
    type: String,
    unique: true,
    requied: true,
  },
  password: {
    type: String,
    requied: true,
  },
  date: {
    type: Date,
    default: Date.now,
  },
});

exports.module = Register = mongoose.model("Register", RegisterSchema);

我看了this tutorial

答案 3 :(得分:1)

你已经被告知MongoDB是无模式的。但是,在实践中,我们有一种“模式”,即对象的对象空间,它与MongoDB数据库所代表的关系。由于Ruby是我的首选语言,并且我没有声称这个答案的详尽性,我建议尝试两个软件:

1. ActiveRecord (part of Rails)
2. Mongoid (standalone MongoDB "schema", or rather, object persistence system in Ruby)

但是,期待学习曲线。我希望其他人能够指出您使用其他优秀语言的解决方案,例如Python。

答案 4 :(得分:1)

从版本3.2开始,mongodb现在在集合级别提供架构验证:

https://docs.mongodb.com/manual/core/schema-validation/

答案 5 :(得分:0)

1.Install mongoose: 
        npm install mongoose

2. Set-up connection string and call-backs

 // getting-started.js 

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test');


//call-backs

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));

db.once('open', function() {
  // we're connected!
});

3. Write your schema

var kittySchema = new mongoose.Schema({
  name: String
});

4. Model the schema

var Kitten = mongoose.model('Kitten', kittySchema);

5. Create a document

var silence = new Kitten({ name: 'Tom' });

console.log(silence.name); // Prints 'Tom' to console

// NOTE: methods must be added to the schema before compiling it with mongoose.model()
kittySchema.methods.speak = function () {
  var greeting = this.name
    ? "Meow name is " + this.name
    : "I don't have a name";
  console.log(greeting);
}

    enter code here

var Kitten = mongoose.model('Kitten', kittySchema);
Functions added to the methods property of a schema get compiled into the Model prototype and exposed on each document instance:

var fluffy = new Kitten({ name: 'fluffy' });
fluffy.speak(); // "Meow name is fluffy"

答案 6 :(得分:0)

创建架构的示例:

db.createCollection("students", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         required: [ "name", "year", "major", "address" ],
         properties: {
            name: {
               bsonType: "string",
               description: "must be a string and is required"
            },
            year: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               description: "must be an integer in [ 2017, 3017 ] and is required"
            },
            major: {
               enum: [ "Math", "English", "Computer Science", "History", null ],
               description: "can only be one of the enum values and is required"
            },
            gpa: {
               bsonType: [ "double" ],
               description: "must be a double if the field exists"
            },
            address: {
               bsonType: "object",
               required: [ "city" ],
               properties: {
                  street: {
                     bsonType: "string",
                     description: "must be a string if the field exists"
                  },
                  city: {
                     bsonType: "string",
                     description: "must be a string and is required"
                  }
               }
            }
         }
      }
   }
})