Форум сайта python.su
Здравствуйте!
Совсем недавно работаю с 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)
Офлайн
'tags.name': queryТак не получится, только через два запроса.
result = db.companies.find({ 'tags': query })
andreiruОднозначно не скажешь, зависит от того, как это все будет использоваться. В документации есть рекомендации и примеры http://docs.mongodb.org/manual/core/data-modeling/
Вообще я правильно выбрал структуру БД или можно запихать компании в пользователя:
Офлайн
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)
Офлайн
andreiruЕсли не считать отсутствия кавычек в двух местах, то да.
а затем уже по компаниям:правильно сделал ?)companies = db.companies.find({ tags: { $in: [tag['_id'] for tag in tags]} })
Офлайн