【问题标题】:MongoDB schema structure and queriesMongoDB 模式结构和查询
【发布时间】:2013-05-25 07:01:46
【问题描述】:

我正在使用 mongoDB 的流星实现,目前的架构如下:

{
 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) 什么时候使用数组而不是对象更好 - 例如,我的照片列表是当前对象,这应该是数组吗?

谢谢。

【问题讨论】:

  • 您的相册和照片可能应该在一个数组中。您可能遇到的一个问题是正确查询数据。查询数组元素并不难,但确实需要您稍微更改一下查询。
  • 您能否给出第 2 项的更好/更清晰的示例(并使用文本 @vinipsmaker 发表评论,然后我会收到通知,我将能够完成我的答案)?跨度>
  • @vinipsmaker - 我一直在尝试使用类似于以下 collectionName.find({setID:"number"}) 的内容进行查询...我一直在尝试返回设置的结果到一个变量,然后使用点符号来检索嵌套照片的数据。它还没有工作,我还有更多的调查要做......理想情况下,我想将特定集合的照片数组返回到一个对象,然后使用把手模板中的#each 遍历它们。谢谢。

标签: mongodb schema meteor


【解决方案1】:

1)

此架构设计是否可行 - 还是过于嵌套和复杂?

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

其他选项是:

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

确实,架构设计取决于您的数据,但同样重要的是您计划对这些数据进行什么。 what 对于架构设计也很重要。

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

不要。

2)

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

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

您的查询可能如下所示:

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

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

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

如果您要单独收藏照片

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

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

3)

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

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

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

PS:

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

【讨论】:

    猜你喜欢
    • 2011-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2013-02-20
    • 2013-07-16
    • 1970-01-01
    相关资源
    最近更新 更多