使用函数在MongoDB中创建索引?

时间:2015-03-05 09:55:29

标签: mongodb indexing

我有一个博客,允许用户投票选择文章。文章的文件如下:

{
  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,我认为可能会有更优雅的方式。我提出了两个想法:

  1. 创建索引时使用函数,例如:

    db.coll.ensureIndex({{$sum: votes.points}: 1})
    
  2. 拥有动态字段。该文件可能如下所示:

    {
      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}
    }
    
  3. 在这些情况下,我只需要更新投票数组。在MongoDB中是否可以这样?

1 个答案:

答案 0 :(得分:1)

根据您对投票数组进行更新的方式,无论是通过在投票数组中插入新投票来更新文档还是更新现有投票,您可以采用的方法是使用 {{3} 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 }
    }
)

你需要考虑Neil Lunn的观点,你不希望同一个用户在你的更新中多次投票。