2012-12-22 32 views
3

我有一个文件,看起来类似于:递增一个{键:值}对象数组与MongoDB的猫鼬驱动器内

{ 
    'user_id':'{1231mjnD-32JIjn-3213}', 
    'name':'John', 
    'campaigns': 
     [ 
      { 
       'campaign_id':3221, 
       'start_date':'12-01-2012', 
       'worker_id': '00000' 
      }, 
      { 
       'campaign_id':3222, 
       'start_date':'13-01-2012', 
       'worker_id': '00000' 
      }, 
      ... 
      etc 
      ... 
     ] 
} 

说我要递增元件7的campaign_idcampaigns阵列中。
使用dot与猫鼬司机,我想我能做到这一点:

camps.findOneAndUpdate({name: "John"}, {$inc: {"campaigns.7.campaign_id": 1}}, upsert: true, function(err, camp) {...etc...});

这不会增加campaign_id
关于增加这个的任何建议?

回答

8

你有正确的想法,但你的upsert选项格式不正确。

试试这个:

camps.findOneAndUpdate(
    {name: "John"}, 
    {$inc: {"campaigns.7.campaign_id": 1}}, 
    {upsert: true}, 
    function(err, camp) {...etc...}); 
+0

出于某种原因,我不明白,如果我说:“运动”'变种更新= +位置+“.campaign_id”'然后'$ inc:{update:1}'不起作用(其中位置是一个整数)。但是,如果我按照上面的方式拼出,那么就可以正常工作:'$ inc:{“campaigns.7.campaign_id”:1}'。你知道为什么吗? – user1460015

+2

因为您不能在JavaScript直接对象中将变量用作键名。所以你必须以编程方式构建你的更新对象。 'var update = {$ inc:{}};更新。$ INC [ '活动。' +位置+“.campaign_id”] = 1;' – JohnnyHK

+0

啊......有趣。谢谢! – user1460015