0

我是 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. 寻找活动头像需要顺序搜索

另一种解决方案是:

{
  "_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,
  }]
}

_id这解决了问题 1 和 2,但没有解决问题 3。它在每个嵌入文档中添加了一个额外的字段。另外,当我插入一个新头像时,我现在需要知道接下来_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,就是这样,而且更丑)。

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

谢谢。

4

1 回答 1

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
        }
    }
}
于 2013-04-04T13:09:47.897 回答