25

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

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

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

对此的最佳做法是什么?

4

7 回答 7

16

您不会在 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"
        }
]
于 2013-06-08T20:43:15.547 回答
15

创建空集合

这是您可以使用内置交互式终端在 MongoDB 中创建空集合的方法:
db.createCollection('someName'); // create empty collection

只是您实际上不必这样做,因为正如之前有人指出的那样,一旦您开始与数据库交互,它们就会实时创建。

MongoDB 是无模式的故事结局,但是......

您可以创建自己的与 mongo 数据库交互的类。在该类中,您可以定义在将数据插入 mongo 集合之前必须满足的规则,否则会引发自定义异常。

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

Mongoose 提供了一个直接的、基于模式的解决方案来为您的应用程序数据建模。它包括内置的类型转换、验证、查询构建、业务逻辑挂钩等,开箱即用。

文档: 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);
});

包起来 ...

能够在我们的代码中设置模式和限制并不会改变 MongoDB 本身是无模式的事实,这在某些情况下实际上是一个优势。这样,如果您决定对架构进行更改,但您不必担心向后兼容性,只需在脚本中编辑架构,您就完成了。这是 MongoDB 背后的基本思想,即能够在同一个集合中存储每个文档中的不同数据集。但是,代码库逻辑中的一些限制总是可取的。
于 2017-01-23T20:07:05.117 回答
4

从 3.2 版开始,mongodb 现在在集合级别提供模式验证:

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

于 2018-06-01T03:53:45.313 回答
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);

我看了这个教程

于 2021-06-27T12:57:59.420 回答
1

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

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

不过,期待学习曲线。我希望其他人会向您指出我的专业之外的其他优秀语言的解决方案,例如 Python。

于 2013-06-08T11:58:52.357 回答
1

创建模式的示例:

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"
                  }
               }
            }
         }
      }
   }
})

于 2021-06-09T04:32:10.043 回答
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"
于 2019-01-24T09:55:51.383 回答