2013-08-15 2 views
0

Вот моя схема:Как сформулировать следующий запрос Mongoose?

var A = new Schema({ 
    active: Boolean 
    , containers: [{ 
     b: { type: ObjectId, ref: 'B' } 
    }] 
}) 

var B = new Schema({ 
    c: { type: ObjectId, ref: 'C' } 
    , d: { type: ObjectId, ref: 'D' } 
}) 

var C = new Schema({ }) 

var D = new Schema({ }) 

Основном A имеет множество контейнеров, которые имеют ссылки на B и B имеет ссылку на C и D.

Теперь у меня есть идентификатор C и мне нужен набор D, которые используются при activeA с. Возможно ли это? Должен ли я каким-то образом изменить схему?

EDIT: реальная схема здесь

//Mashup has a number of Containers (containerSchema is a sub-doc) 
    //so that the same Component could belong to two different Containers 
    var containerSchema = new Schema({ 
      pos: { top: Number, left: Number } 
     , size: { width: Number, height: Number } 
     , component: { type: ObjectId, ref: 'Component' } 
    }) 

    var mashupSchema = new Schema({ 
      name: String 
     , desc: String 
     , size: { width: Number, height: Number } 
     , active: Boolean 
     , containers: [containerSchema] 
    }) 

    //I am using 'mongoose-schema-extend' to inherit from componentSchema (waiting for the new PR) 
    var componentSchema = new Schema({ 
      name: String 
     , desc: String 
    }, { collection : 'components', discriminatorKey : '_type' }) 

    //now the various components 
    var imageComponentSchema = componentSchema.extend({ 
      url: String 
    }) 

    var textComponentSchema = componentSchema.extend({ 
      text: String 
    }) 


    var htmlComponentSchema = componentSchema.extend({ 
      html: String 
    }) 

    //this particular component needs a page and a selector 
    //(which could live outside it and belong to multiple components) 
    var webComponentSchema = componentSchema.extend({ 
      page: { type: ObjectId, ref: 'Page' } 
     , selector: { type: ObjectId, ref: 'Selector' } 
    }) 

    var pageSchema = new Schema({ 
      name: String 
     , desc: String 
     , url: String 
     , active: { type: Boolean, default: false } 
    }) 

    var selectorSchema = new Schema({ 
      desc: String 
     , url: String 
     , cssPath: String 
    }) 

    ///MODELS 
    var Mashup = mongoose.model("Mashup", mashupSchema) 
    var Component = mongoose.model("Component", componentSchema) 
    var ImageComponent = mongoose.model("ImageComponent", imageComponentSchema) 
    var TextComponent = mongoose.model("TextComponent", textComponentSchema) 
    var HtmlComponent = mongoose.model("HtmlComponent", htmlComponentSchema) 
    var WebComponent = mongoose.model("WebComponent", webComponentSchema) 
    var Page = mongoose.model("Page", pageSchema) 
    var Selector = mongoose.model("Selector", selectorSchema) 

ответ

0

Законченное полностью меняет схему БД. Закрытие.

1

Ты слишком реляционная! Прямо сейчас вы, я не думаю, что вы можете сделать это эффективно, как вы должны будете:

  • найти все Б, которые имеют c: {id}
  • найти все А о том, что есть b, что есть множество результата от запрос 1 и являются Активными
  • выяснить, какие B принадлежат к идентификаторам вы нашли в предыдущем запросе
  • выяснить, какие двойки принадлежат к Б вы нашли

Я думаю, вы должны определенно денормализовать свою схему здесь. Например, вы можете поместить все вышеперечисленное в одном документе:

{ 
    Active: true, 
    containers: [ // B's 
     { c: [ 
      { _id: X, field1: foo }, 
      { _id: X, field1: foo }, 
     ] }, 
     { d: [ 
      { _id: X, field1: foo }, 
      { _id: X, field1: foo }, 
     ] } 
    ] 
} 

И тогда вы можете просто сделать это с одним запросом:

db.collection.find(
    { "container.c._id" : your_id, Active: true }, // query 
    { "container.d" : 1 } // projection 
); 
+0

Но мне все еще нужно B .. Я хочу иметь возможность запрашивать все B. Клиент должен иметь возможность создать новый A, а затем выбрать B из списка и добавить его в A. Я предполагаю, что я может иметь B и вместо того, чтобы нажимать его, извлечь C и D и нажать на них. Mhh – fusio

+0

Предоставьте некоторые реальные данные вместо A, B, C и D ... – Derick

+0

Вы на 100% прав, извините, что пример. [Здесь] (https://groups.google.com/forum/#!topic/mongoose-orm/XUENp02gGWE) Я опубликовал реальный пример. Благодаря :) – fusio

Смежные вопросы