Найти - Пользователи
Полная версия: Выборка MongoDB
Начало » Базы данных » Выборка MongoDB
1
andreiru
Здравствуйте!

Совсем недавно работаю с 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")
}

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

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

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

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

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

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

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

правильно сделал ?)
reclosedev
andreiru
а затем уже по компаниям:

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

Только может все-таки обойтись без name?
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB