MongoDB架构结构和查询

时间:2013-05-24 12:38:08

标签: mongodb schema meteor

我正在使用mongoDB的meteor实现,目前有一个这样的架构:

{
 photoalbum 1:
    {
     description: album,
     title: xyz,
     photos:
        {
         photo 1:
            {
             description: photo,
             photodata:
                {
                 title:xyz,
                 url:...,
                 tags:xyz
                }
            },
         photo 2:
            {....},
         photo 3:
            {....},
        }
    },
 photoalbum 2:
    {
     description: album,
     title: xyz,
     photos:
        {
         photo 1:
            {....},
         photo 2:
            {....},
         photo 3:
            {....},        
        }
    }
}

我有效地尝试将照片的数组/对象嵌套在其父相册中。我这样做的逻辑是,我希望能够从特定的集合中返回所有照片,并且将相关照片嵌套在一起看起来很直观。

我的问题归结为:

1)这种架构设计是否正常 - 或者它是否过于嵌套和复杂?例如,我应该将照片与集合顶层中的集合混合在一起吗?

2)如何构建database.find()操作以仅返回属于某个集合的照片?我以为我能够在某个父级别内搜索特定类型的项目(例如{description:“photo”}(例如{description:“album”}但我还没弄清楚这实际上是如何工作的我是否必须在每张照片中嵌入相册标识符,然后查询与该标识符匹配的照片?

3)什么时候使用数组与对象更好 - 例如,我的光刻胶是当前的一个对象,它应该是一个数组吗?

感谢。

1 个答案:

答案 0 :(得分:1)

1)

  

这种架构设计是否正常 - 或者它是否过于嵌套和复杂?

如果您计划对这些键执行任何操作,此设计要求您提前知道照片键。如果这对你没用,这个设计可能会有效。

其他选择是:

  • 使用照片数组而不是对象照片。
  • 使用单独的集合而不是嵌入。

确实,架构设计取决于您的数据,但同样重要的是您计划对该数据执行的 对于架构设计也很重要。

  

例如,我应该将照片与集合顶层的照片混合在一起吗?

别。

2)

  

如何构建database.find()操作以仅返回属于某个集合的照片?我以为我能够在某个父级别内搜索特定类型的项目(例如{description:“photo”}(例如{description:“album”}但我还没弄清楚这实际上是如何工作的我是否必须在每张照片中嵌入相册标识符,然后查询与该标识符匹配的照片?

如果使用嵌入式文档/数组

您的查询可能如下所示:

db.album.find({_id: 0/*album id*/})

如果您使用数组而不是对象,您甚至可以根据照片的字段进行查询(您可以阅读有关此herehere的更多信息):

db.album.find({_id: 0/*album id*/, "photos.description": "hi there"})

如果您为照片设置了单独的集合

您需要将有关包含相册的信息放在某处。如果您将此信息放入相册集合中,则需要两个查询。但是,如果您将此信息放在照片集中,则查询可能如下所示:

db.photos.find({parentAlbum: 0/*album id*/})

3)

  

何时使用数组与对象更好 - 例如,我的光刻胶是当前的对象,是否应该是一个数组?

如果您可以毫无问题地使用数组,我建议您这样做,因为您将拥有更丰富的表现力。

如果您需要引用数组的单个元素(see this),则可能会出现问题。

PS:

这是一个令人困惑的问题。我不确定我是否能够回答你的要求。