LINUX.ORG.RU

Помогите с проектированием БД в mongodb

 , ,


1

2

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

Подскажите, как правильно поступить в такой ситуации в mongodb, какие оверхеды возможны?

Необходимо хранить кучи разных элементов, которые необходимо выводить в едином месте в хронологическом порядке.

В mongodb их лучше поместить в одну коллекцию или раскидать по разным (получается восемь коллекций, по количеству типов элементов)?

Не просядет ли скорость выборки при хранении всех их в одной коллекции?

★★

Не просядет ли скорость выборки при хранении всех их в одной коллекции?

не просядет, наоборот, потому как индекс запилишь по датам и сразу нужный результат получишь. Храни всё вместе.

RedPossum ★★★★★ ()

какие оверхеды возможны?

если у тебя кучка неструктурированных документов, без вложенности, то оверхеда никакого не будет. Если у тебя подразумевается некая структура данных для них, то тоже ничего страшного, сериализовать будешь в middleware, можешь даже какое-нибудь хитрое служебное поле '_type' там хранить. А вот если у тебя вложенность есть, то монга тебе не подходит, потому как геморой это: выборка вложенных документов невозможна, потому как вытаскиваются только документы 0-го уровня из коллекции; ссылочной целостности нет.

//вообще не слушай меня особо, в продакшне мы только начали пытаться это все применять, поэтому опыта чуть больше 0. Подожди лучше грамотных людей.

RedPossum ★★★★★ ()
Ответ на: комментарий от Y

можно.

к примеру у нас есть {a:1, b:{ba:1, bc:2}} в коллекции test.

db.test.find({a:1},{«b.ba»:1}) вернет нам что-то такое

{_id : ObjectId(...), b:{ba:1}}

Но видишь, вложенность сохраняется. С вложенными массивами еще веселее.

RedPossum ★★★★★ ()
Ответ на: комментарий от Y

да в принципе нет её, так, особенности. Проблемы с массивами:

db.test1.find().pretty()
{
	"_id" : ObjectId("512b602ff35c57296730d2be"),
	"level" : 1,
	"value" : "foo",
	"b" : [
		{
			"level" : 2,
			"value" : "bar"
		},
		{
			"level" : 2,
			"value" : "baz"
		}
	]
}

результатом db.test1.find({«b.value»:«baz»},{b:1, «_id»:0}) будет

{
	"b" : [
		{
			"level" : 2,
			"value" : "bar"
		},
		{
			"level" : 2,
			"value" : "baz"
		}
	]
}

то есть весь массив b. Решения из области map/reduce опробуются коллегой на работе, результаты можно уточнить у него, если надобно

RedPossum ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.