MongoDB: Как определить схему?

Итак, у меня есть приложение, которое использует MongoDB как базу данных. Приложение использует несколько коллекций.

Когда и как мне нужно определить "схему" базы данных, которая включает в себя настройку всех коллекций, а также нужных индексов?

AFAIK, вы не можете определить пустые коллекции в MongoDB (исправьте меня, если я ошибаюсь, если я могу это сделать, он в основном ответит на этот вопрос). Должен ли я вставлять фиктивное значение для каждой коллекции и использовать это для установки всех моих индексов?

Какова наилучшая практика для этого?

Ответ 1

Вы не создаете коллекции в 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"
        }
]

Ответ 2

Создать пустую коллекцию

Прежде всего, это то, как вы можете создать пустую коллекцию в MongoDB, используя встроенный в интерактивный терминал, так что вы можете сделать это,

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

просто вам не нужно этого делать, потому что, как кто-то сказал раньше, они будут созданы в реальном времени, как только вы начнете взаимодействовать с базой данных.

MongoDB - это конец истории без схемы, но...

Вы можете создать свой собственный класс, который взаимодействует с базой данных Монго. В этом классе вы можете определить правила, которые должны быть выполнены, прежде чем он сможет вставлять данные в коллекцию mongo, иным разумным исключением.

Или, если вы используете node.js на стороне сервера, вы можете установить пакет узлов mongoose, который позволяет вам взаимодействовать с базой данных в стиле ООП (зачем изобретать колесо, верно?).

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 - иметь возможность хранить разные наборы данных в каждом документе в одной коллекции. Однако некоторые ограничения в логике кода всегда желательны.

Ответ 3

Вам уже научили, что MongoDB является схематичным. Однако на практике у нас есть своего рода "схема", и это объектное пространство объекта, отношения которого представляет собой база данных MongoDB. С ceveat, что Ruby - мой вступительный язык, и что я не претендую на исчерпывающий ответ, я рекомендую попробовать две части программного обеспечения:

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

Ожидайте кривую обучения. Я надеюсь, что другие расскажут вам о решениях на других отличных языках вне моего опыта, таких как Python.

Ответ 5

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"