如何在mongodb中增加一个字段的值?

9

I have the following Mongo DB document structure:

{
  _id: channelId, 
  title: channelTitle,
  pubDate: channelPubdate, 
  items: 
  [
    {
      title: newsTitle,
      desc: newsDescription, 
      link: newsLink, 
      pubDate: Date, 
      clicks: 0
    },
    {/*One more*/},
    {/*...*/}
  ] 
}

我遇到了在集合中递增“点击”字段的问题(更新嵌入在数组中的文档的字段)。

我尝试在事件处理程序(客户端)中使用以下代码:

News.update({ _id : Session.get("channelId"), "items.link" : this.link },
  { $inc: { "items.clicks": 1 } }
);

但是它会出现一个错误:未捕获的错误:不允许。不受信任的代码只能通过ID更新文档。[403] 然后我尝试通过服务器方法:
Meteor.methods({
    incClicks: function(id, news) 
    {
      News.update({ _id : id, "items.link" : news.link }, 
        { $inc : { "items.clicks": 1 } }
      );
    }
});

又出现了一个异常:Exception while invoking method 'incClicks' MongoError: can't append to array using string field name: clicks

针对这个操作,正确的Mongo请求应该是什么?


问题在于 items 是一个数组。它可能包含多个项目 - 每个项目都有自己的 clicks 计数。你想增加哪一个? - David Weldon
不是所有的元素都会触发事件处理程序。我展示了网站上的项目对象。用户可能会点击某个元素(项目中的对象),之后我需要计算该元素的点击次数并更新数据库。换句话说,增加mongo中相应对象的“clicks”字段。 - dvplut
1个回答

11

正如错误所示,在客户端上,您只能使用简单的_id选择器执行更新。我建议您使用一种方法对代码进行轻微修改:

如错误所示,您在客户端只能使用简单的_id选择器进行更新。建议您对代码进行轻微的修改来解决问题:

Meteor.methods({
  incClicks: function(id, news) {
    check(id, String);
    check(news, Match.ObjectIncluding({link: String}));

    News.update(
      {_id: id, 'items.link': news.link},
      {$inc: {'items.$.clicks': 1}}
    );
  }
});

这里我们使用$运算符来更新特定的嵌入式文档。有关更多详细信息,请参见文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接