我是 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,
}]
}
这个解决方案很简单,但有几件事我不喜欢:
- 更改活动头像意味着更新两个嵌入文档
- 我不确定在并发访问的情况下它会表现良好(read_avatar+change_active_avatar 或 change_active+change_active)(会吗?)
- 寻找活动头像需要顺序搜索
另一种解决方案是:
{
"_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,就是这样,而且更丑)。
所有这些解决方案都有效,但我正在寻找“正确的方法”来做到这一点。有任何想法吗?如果我允许用户拥有多个活动头像(无论这意味着什么)怎么办?
谢谢。