Mongoose - рекурсивный запрос (объединение нескольких результатов) - PullRequest
0 голосов
/ 04 марта 2012

У меня есть следующая общая схема для представления различных типов информации.

var Record = new Schema (
{
   type: {type: String}, // any string (foo, bar, foobar)
   value: {type: String}, // any string value
   o_id: {type:String}
}
);

Некоторые записи, основанные на этой схеме, имеют:

  • type = "car"
  • value = "ferrari" или
  • value = "ford"

Некоторые записи имеют тип "topspeed" со значением "210", но они всегда имеют o_id (например,связанный "у Ferrari есть эта скорость").Так что, если «ferrari имеет максимальную скорость 300», тогда обе записи имеют одинаковый o_id.

Как мне сделать запрос, чтобы найти «ferrari with topspeed 300», когда я не знаю o_id?

Единственное решение, которое я нашел, - это сначала выбрать автомобили "ferrari", а затем, зная все o_id для всех "ferrari", использовать его для определения максимальной скорости.

В псевдокоде:

Record.find({type:"car", value:"ferrari"}, function(err, docs)
{
   var condition = [];// create array of all found o_id;
   Record.find({type:"topspeed", value:"300"}...
}

Я знаю, что некоторые слияния или объединения могут быть невозможны, но как насчет объединения этих условий во избежание рекурсии?

РЕДАКТИРОВАТЬ: Лучший пример:

  • Предположим, у меня есть HTML-документ, который содержит элементы DIV с определенным идентификатором (o_id).

  • Теперь каждый элемент div может содержать различные типы элементов микроданных (Car, Animal ...).

  • Каждый элемент микроданных имеет различные свойства ("topspeed", "numberOfLegs" ...) в зависимости от типа (Автомобиль имеет максимальную скорость, число животныхOfLegs)

  • Каждое свойство имеет какое-то значение (310 км / ч, 4 ноги)

Теперь я сохраняю эти элементы микроданных в базе данных, но в общем, независимо от типаи значения, которые они содержат, так как пользователь может определять собственные схемы от Car до Animal (почти все).Для этого я определил схему записи: тип состоит из «itemtype_propertyname», а значение - это значение свойства.

В конечном итоге я бы хотел запросить "Дайте мне o_id всех элементов DIV, которые содержат элемент Ferrari и элемент Dog" одновременно.

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

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

1 Ответ

0 голосов
/ 05 марта 2012

Я думаю, что было бы намного лучше объединить все записи, которые имеют o_id, в одну запись. E.g.:

{
  _id: ObjectId(...),
  car: "ferarri",
  topspeed: 300
}

Тогда у вас не будет этой проблемы, и ваша схема будет более эффективной как по скорости, так и по объему хранилища. Вот как MongoDB предназначен для использования - гетерогенные данные могут храниться в одной коллекции, потому что MongoDB не имеет схемы. Если вы продолжите свой текущий дизайн, то нет, нет способа избежать многократных обращений к базе данных.

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