Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 15, 2013 14:56:47

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка MongoDB

Здравствуйте!

Совсем недавно работаю с MongoDB, подскажите как правильно сделать выборку:


Пользователи/компании/теги(по тегам будет поиск)

# users
{
    "_id" : "andrey",
    "id_secret" : "XDcTULHYM9vNK0SWgp3pmD6YajBRHeRf",
    "password" : "12345",
    "name" : "andrey",
    "email" : "andreyl@mail.ru",
    "last_login" : null,
    "created" : ISODate("2013-06-15T17:06:27Z"),
    "updated" : ISODate("2013-06-15T17:06:27Z")
}
#companies 
{
    "_id" : "apple",
    "name" : "Apple INC",
    "user" : "andrey",
    "description" : "",
    "tags" : [ 
        "iphone", 
        "ipad", 
        "ipod", 
        "ipodnano"
    ],
    "valid" : true,
    "created" : ISODate("2013-06-12T17:03:00Z"),
    "updated" : ISODate("2013-06-12T17:03:00Z")
}
# tags
{
    "_id" : "iphone",
    "name" : "iPhone",
    "visits" : 6,
    "created" : ISODate("2013-05-15T20:00:00Z")
}


    result = db.companies.find({
        'tags.name': query
    })

как выбрать компании по названию тега ?

Вообще я правильно выбрал структуру БД или можно запихать компании в пользователя:

# users
{
    "_id" : "andrey",
    "id_secret" : "XDcTULHYM9vNK0SWgp3pmD6YajBRHeRf",
    "password" : "12345",
    "name" : "andrey",
    "email" : "andreyl@mail.ru",
"companies ":[
{
    "_id" : "apple",
    "name" : "Apple INC",
    "description" : "",
    "tags" : [ 
        "iphone", 
        "ipad", 
        "ipod", 
        "ipodnano"
    ],
    "valid" : true,
    "created" : ISODate("2013-06-12T17:03:00Z"),
    "updated" : ISODate("2013-06-12T17:03:00Z")
}
]
    "last_login" : null,
    "created" : ISODate("2013-06-15T17:06:27Z"),
    "updated" : ISODate("2013-06-15T17:06:27Z")
}

?



Отредактировано andreiru (Июнь 15, 2013 15:19:27)

Офлайн

#2 Июнь 15, 2013 16:56:17

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Выборка MongoDB

'tags.name': query
Так не получится, только через два запроса.

Мне кажется name для тега является избыточным, так как оно, в основном, повторяет _id. Если бы tags содержал _id:
    result = db.companies.find({
        'tags': query
    })

andreiru
Вообще я правильно выбрал структуру БД или можно запихать компании в пользователя:
Однозначно не скажешь, зависит от того, как это все будет использоваться. В документации есть рекомендации и примеры http://docs.mongodb.org/manual/core/data-modeling/

Офлайн

#3 Июнь 15, 2013 17:29:25

andreiru
От:
Зарегистрирован: 2010-11-06
Сообщения: 154
Репутация: +  0  -
Профиль   Отправить e-mail  

Выборка MongoDB

reclosedev
Так не получится, только через два запроса.

Сначала ищу по тегам:

tags = db.tags.find({
        '_id': tag_name
})

а затем уже по компаниям:

companies = db.companies.find({ tags: { $in: [tag['_id'] for tag in tags]} })

правильно сделал ?)



Отредактировано andreiru (Июнь 15, 2013 17:35:53)

Офлайн

#4 Июнь 15, 2013 19:52:39

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Выборка MongoDB

andreiru
а затем уже по компаниям:

companies = db.companies.find({ tags: { $in: [tag['_id'] for tag in tags]} })
правильно сделал ?)
Если не считать отсутствия кавычек в двух местах, то да.

Только может все-таки обойтись без name?

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version