1

我正在使用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:"album"} 中搜索特定类型的项目(例如 {description:"photo"}),但我还没有弄清楚这实际上是如何工作的. 是否必须在每张照片中嵌入相册标识符,然后查询与该标识符匹配的照片?

3)何时使用数组与对象更好 - 例如,我的照片列表是当前对象,这应该是一个数组吗?

谢谢。

4

1 回答 1

1

1)

这种模式设计是否可行 - 还是变得过于嵌套和复杂?

如果您打算对这些键进行任何操作,此设计需要您提前知道照片键。如果这对您来说没问题,那么这种设计可能会奏效。

其他选择是:

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

事实上,模式设计取决于您的数据,但同样重要的是计划如何处理这些数据。什么对模式设计也很重要。

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

不。

2)

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

如果您使用嵌入的文档/数组

您的查询可能如下所示:

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

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

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

如果您有单独的照片集

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

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

3)

何时使用数组与对象更好 - 例如,我的照片列表是当前对象,这应该是一个数组吗?

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

如果您需要对数组的单个元素的引用,这可能会出现问题(请参阅this)。

PS:

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

于 2013-05-24T23:01:46.530 回答