如何在MeteorJS中更新MongoDB集合上的子文档数组

时间:2016-06-08 02:32:38

标签: javascript arrays mongodb meteor

我在Meteor中更新mongo集合时遇到问题。

也许我只是不明白$addtoset是如何运作的。

这是我的基本文档,或多或少是在fixtures.js我初始化项目的地方:

var someUser = Meteor.users.findOne("W9YEs84QFhZzJeB6j");

var NewIdea = Ideas.insert({
  title: "This Is a Title",
  body: "Blah Blah Blah Body Goes Here",
  userId: someUser._id,
  author: someUser.profile.name,
  timestamp: new Date(now - 5 * 3600 * 1000),
  score: [],
  overallScore: 0,
  votedOnBy: [],
  timesVotedOn: 0
});

以下是我希望在更新后看起来的样子:

{
  _id: "bKXXrpYmppFBfq9Kx",
  title: "This Is a Title",
  body: "Blah Blah Blah Body Goes Here",
  userId: "W9YEs84QFhZzJeB6j",
  author: "Users Name",
  timestamp: ISODate("2016-06-07T20:37:05.775Z"),
  score: [
    {
      userId: ""W9YEs84QFhZzJeB6j",
      score: 1
    }
  ],
  overallScore: 1,
  votedOnBy: [
    "W9YEs84QFhZzJeB6j"
  ],
  timesVotedOn: 1
}

以下是我用来更新的代码(不起作用):

Ideas.update("bKXXrpYmppFBfq9Kx", {
  $addToSet: {score: {userId: someUser._id, score: 1}},
  $inc: {overallScore: 1},
  $addToSet: {votedOnBy: someUser._id},
  $inc: {timesVotedOn: 1}
});

这是来自mongo控制台的实际文档(更新后):

{
  "_id" : "bKXXrpYmppFBfq9Kx",
  "title" : "This Is a Title",
  "body" : "Blah Blah Blah Body Goes Here",
  "userId" : "W9YEs84QFhZzJeB6j",
  "author" : "Users Name",
  "timestamp" : ISODate("2016-06-07T20:37:05.775Z"),
  "votedOnBy" : [
    "W9YEs84QFhZzJeB6j"
  ],
  "timesVotedOn" : 1
}

请注意,overallScorescore根本不存在。

我是Meteor和Mongo的新手(也许这很明显)。有谁知道我在这里做错了什么?或者我需要什么才能让我更新呢?

1 个答案:

答案 0 :(得分:2)

记住修饰符只是一个对象很重要。以下对象文字:

{
  a: 1, b: 1,
  a: 2, b: 2
}

评估为:

{ a: 2, b: 2 }

因为密钥被分配了两次,最后一次写入获胜。

在您的代码中,相同的想法适用于$addToSet$inc键。要修复它,请像这样写下update

Ideas.update("bKXXrpYmppFBfq9Kx", {
  $addToSet: {
    score: { userId: someUser._id, score: 1 },
    votedOnBy: someUser._id
  },
  $inc: {
    overallScore: 1,
    timesVotedOn: 1
  }
});