我有一个博客,允许用户投票选择文章。文章的文件如下:
{
title: "title of post",
body: "text text text text text text",
votes: [
{user: "user1", points: 2},
{user: "user13", points: 1},
{user: "user30", points: 1},
{user: "user2", points: -1},
{user: "user51", points: 3},
],
sum_of_votes: 6
}
我想根据帖子收到的票数进行排序。目前我添加了一个字段sum_of_votes
,每次有人投票时都需要更新。由于votes
已包含原始数据for sum_of_votes
,我认为可能会有更优雅的方式。我提出了两个想法:
创建索引时使用函数,例如:
db.coll.ensureIndex({{$sum: votes.points}: 1})
拥有动态字段。该文件可能如下所示:
{
title: "title of post",
body: "text text text text text text",
votes: [
{user: "user1", points: 2},
{user: "user13", points: 1},
{user: "user30", points: 1},
{user: "user2", points: -1},
{user: "user51", points: 3},
],
sum_of_votes: {$sum: votes.points}
}
在这些情况下,我只需要更新投票数组。在MongoDB中是否可以这样?
答案 0 :(得分:1)
根据您对投票数组进行更新的方式,无论是通过在投票数组中插入新投票来更新文档还是更新现有投票,您可以采用的方法是使用 {{3} 你需要考虑Neil Lunn的观点,你不希望同一个用户在你的更新中多次投票。sum_of_votes
上的{/ strong>运算符,其中包含您用来更新votes.points
的值。例如,如果您为具有变量userId
值的用户插入新投票而实际投票点位于变量points
(必须是数字),您可以尝试:< / p>
db.articles.update(
{"_id" : article_id},
{
"$addToSet": {
"votes": {
"user": userId,
"points" : points
}
},
"$inc": { "sum_of_votes": points }
}
)