在MongoDB中处理嵌入式文档引用的推荐方法是什么?

时间:2013-04-03 21:41:27

标签: mongodb reference

我是MongoDB的新手。这是我的问题:用户可以有多个头像,但只有一个是活动的。以下是用户文档目前的样子:

{
  "_id": ObjectId("515c99f7e4d8094a87e13757"),
  "avatars": [{
    "url": "http://example.com/img/photo1.jpg",
    "width": 50,
    "height": 50,
  }, {
    "active": true,
    "url": "http://example.com/img/photo2.jpg",
    "width": 50,
    "height": 50,
  }]
}

这个解决方案很简单,但有一些我不喜欢的东西:

  1. 更改活动头像意味着更新两个嵌入文档
  2. 我不确定在并发访问的情况下它会表现得很好(read_avatar + change_active_avatar或change_active + change_active)(会吗?)
  3. 寻找活跃的头像需要顺序搜索
  4. 另一种解决方案是:

    {
      "_id": ObjectId("515c99f7e4d8094a87e13757"),
      "active_avatar_id": 2,
      "avatars": [{
        "_id": 1,
        "url": "http://example.com/img/photo1.jpg",
        "width": 50,
        "height": 50,
      }, {
        "_id": 2,
        "url": "http://example.com/img/photo2.jpg",
        "width": 50,
        "height": 50,
      }]
    }
    

    这解决了问题1和2,但没有问题3.它在每个嵌入式文档中添加了额外的_id字段。另外,当我插入一个新的头像时,我现在需要知道下一个_id要使用的是什么(除非我使用了objectId,但它只是一个12字节的id,只有几百个头像(最大)。

    所以另一种解决方案可能就是这样:

    {
      "_id": ObjectId("515c99f7e4d8094a87e13757"),
      "active_avatar": {
        "url": "http://example.com/img/photo2.jpg",
        "width": 50,
        "height": 50,
      },
      "extra_avatars": [{
        "url": "http://example.com/img/photo1.jpg",
        "width": 50,
        "height": 50,
      }]
    }
    

    没有比第一个解决方案好多了(它只是解决问题#3,就是这样,而且它更加丑陋)。

    所有这些解决方案都有效,但我正在寻找“正确的方法”。有任何想法吗?如果我允许用​​户拥有多个活动头像(无论这意味着什么)该怎么办?

    感谢。

1 个答案:

答案 0 :(得分:1)

您是否考虑过文档模型中的文档?

{
    "_id" : ObjectId("515c99f7e4d8094a87e13758"),
    "active_avatar_id" : 2,
    "avatars" : {
        "1" : {
            "url" : "http://example.com/img/photo1.jpg",
            "width" : 50,
            "height" : 50
        },
        "2" : {
            "url" : "http://example.com/img/photo2.jpg",
            "width" : 50,
            "height" : 50
        }
    }
}