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.
Ответ 4
Начиная с версии 3.2, mongodb теперь обеспечивает проверку схемы на уровне коллекции:
https://docs.mongodb.com/manual/core/schema-validation/
Ответ 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"