这是我的架构:
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
的ID,我需要D
active
使用的一组A
。这甚至可能吗?我应该以某种方式更改架构吗?
编辑:这里的真实架构
//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
的A,即查询1 和的结果集合我认为你最应该在这里对你的架构进行非规范化。例如,您可以将以上所有内容放在一个文档中:
{
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
);
答案 1 :(得分:0)
完全更改数据库架构。闭。