如何在Mongodb中修改更深层次的属性?

时间:2013-08-30 01:11:07

标签: mongodb meteor

我有一个看起来像这样的对象:

{articleId:"1"
 promotions:[{promoterId:"2"
              viewerIps:['3', '4', '5']},
              {promoterId:"6"
              viewerIps:['7', '8', '9']}]}

基本上,我想跟踪有多少人(以及他们的IP)根据他们共享的用户特定链接查看某篇文章。

如果有人第一次查看该推广人的特定文章,我可以像这样推送到促销阵列:

Views.update({articleId:articleId}, {$push: {promotions:{promoterId:promoterId,
viewerIps:[viewerIp]}}});

但是假设我想推送一个特定的viewerIps数组 - 特定于articleId和promoterId。我怎么能这样做?

由于

2 个答案:

答案 0 :(得分:1)

您可以使用.表示法

Views.update({articleId:articleId}, 
   {
      $push: {"promotions.0.viewerIps"  :viewerIp}
   },
      $set:  {"promotions.0.promoterId":promoterId}
});

0处的数字来自您要更改的数组中的索引位置。您可以使用positional operator$来查询要更改的阵列。我使用上面的数字代替$的原因是meteor尚未完全支持$

如果您愿意,您只能在服务器上使用它。 There is an open github ticket about this

答案 1 :(得分:0)

我喜欢的流星的一个方面是你可以使用javascript / coffeescript 到处。我谦卑地建议你将这个策略扩展到你使用mongo更新。我发现自己只是直接使用我的json /对象操作能力而且$设置整个事情,而不是学习另一种语法。有人会说,限制你检索的字段是不成熟的优化,直到证明它会产生影响,所以你可能无论如何都要检索数据。

在摘要中,可能有一段时间,移动庞大的数据结构是非常可怕的,但如果你遇到这个问题,那么为每个启动器创建一个新文档可能就是你应该做的。特别是因为我的直觉说我可能比启动者ID和观看者ip更喜欢信息。