Насколько умный MongoDB? - PullRequest
       15

Насколько умный MongoDB?

0 голосов
/ 24 сентября 2011

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

Рассмотрим эту коллекцию (fruits_inventory) в качестве примера:

{
    "name"      : "Orange",
    "type"      : "citric",
    "available" : 3
}
{
    "name"      : "Apple",
    "type"      : "pome",
    "available" : 0
    "note"      : "Not shipping this month"
}
{
    "name"      : "Pear",
    "type"      : "pome",
    "available" : 2
}

(No indexes set)

1) Выбор поля

db.fruits_inventory.findOne({name:"Orange"},{"note":1});

Будет ли этот запрос искать документ, содержащий только поле name со значением Orange и возвращаться с первым попаданием, даже если для него не установлено поле note? Или он продолжит поиск документа, содержащего поле note?

2) С уникальными индексами

Если я установлю уникальный индекс на name, изменится ли ответ на предыдущий вопрос?

Пока только эти два вопроса. Ответы будут с благодарностью.

Ответы [ 2 ]

7 голосов
/ 24 сентября 2011

Я написал следующий скрипт:

// sofruit.js
db = db.getSiblingDB('test');

db.fruits_inventory.drop();
db.fruits_inventory.save({
    "name"      : "Orange",
    "type"      : "citric",
    "available" : 3
});
db.fruits_inventory.save({
    "name"      : "Apple",
    "type"      : "pome",
    "available" : 0,
    "note"      : "Not shipping this month"
});
db.fruits_inventory.save({
    "name"      : "Pear",
    "type"      : "pome",
    "available" : 2 
});

var a1 = db.fruits_inventory.findOne({name:"Orange"},{"note":1});

db.fruits_inventory.ensureIndex({name:1}, {unique:true});

var a2 = db.fruits_inventory.findOne({name:"Orange"},{"note":1});

Затем я запустил его из оболочки Монго и получил:

> load('../mongojs/sofruit.js');
> a1
{ "_id" : ObjectId("4e7d119e9b3e59bf2e0c5199") }
> a2
{ "_id" : ObjectId("4e7d119e9b3e59bf2e0c5199") }  
>

Итак, ответ «Да», он вернетсяпервый удар, даже если у него нет поля «примечание».Добавление индекса не меняет этого.

3 голосов
/ 24 сентября 2011

Вы можете подключиться напрямую к mongodb и проверить его:

MongoDB shell version: 2.0.0
connecting to: test
> use test
switched to db test
> db.fruits_inventory.save({
...     "name"      : "Orange",
...     "type"      : "citric",
...     "available" : 3
... });
> db.fruits_inventory.save({
...     "name"      : "Pear",
...     "type"      : "pome",
...     "available" : 2
... })
> db.fruits_inventory.save({
...     "name"      : "Apple",
...     "type"      : "pome",
...     "available" : 0,
...     "note"      : "Not shipping this month"
... })
> db.fruits_inventory.find()
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0"), "name" : "Orange", "type" : "citric", "available" : 3 }
{ "_id" : ObjectId("4e7d101b626e0ab7b5074bb1"), "name" : "Pear", "type" : "pome", "available" : 2 }
{ "_id" : ObjectId("4e7d1059626e0ab7b5074bb2"), "name" : "Apple", "type" : "pome", "available" : 0, "note" : "Not shipping this month" }
> db.fruits_inventory.find({name: "Orange"},{"note":1})
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0") }
> db.fruits_inventory.ensureIndex({name:1}, {unique:true})
> db.fruits_inventory.find({name: "Orange"},{"note":1})
{ "_id" : ObjectId("4e7d0fa5626e0ab7b5074bb0") }

Таким образом, в ответ на ваш вопрос, когда вы запрашиваете поле примечания, оно просто возвращает идентификатор, и наличие уникального индекса не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...