2013-01-12 118 views
0

我想尝试向数组添加更多值,但是因此必须匹配两个值。我得到它与一个价值工作,但不与两个。这是我有:MongoDB - 使用python更新

{ "_id" : ObjectId("50f1a05d00bf6832b03a01cb"), 
    "app" : "494258956", 
    "keywords" : [ 
    { "data" : [ 
     { "device" : "software", 
      "date" : Date(1358012509633), 
      "rank" : 1, 
      "shop" : "143443" } ], 
     "keyword" : "test" } ] } 

当我有一个新的“数据”关键字“测试”和应用程序“494258956”,那么新的一组应该被添加到“数据”,并期待这样的:

{ "_id" : ObjectId("50f1a05d00bf6832b03a01cb"), 
    "app" : "494258956", 
    "keywords" : [ 
    { "data" : [ 
     { "device" : "software", 
      "date" : Date(1358012509633), 
      "rank" : 1, 
      "shop" : "143443" } 
, { "device" : "software", 
      "date" : Date(1358012599633), 
      "rank" : 2, 
      "shop" : "143443" }], 
     "keyword" : "test" } ] } 

在此先感谢。

+1

检出$ push operator http://docs.mongodb.org/manual/reference/operator/push/ –

回答

0

这似乎做什么你问(JavaScript语法):

coll.update({ 
     "app": "494258956", 
     "keywords": { 
      "$elemMatch": { "keyword": "test" } 
     } 
    }, 
    { 
     "$push": { 
      "keywords.$.data": { 
       "device" : "software", 
       "date" : new Date(1358012599633), 
       "rank" : 2, 
       "shop" : "143443" 
      } 
     } 
    } 
+0

谢谢。它适用于关键字是否存在,但如果不存在并且必须插入数据集则不适用。我只是得到一个$。你知道一个解决方案如何工作吗? – user1972788

+0

我很确定这对于“upsert”操作来说太复杂了。我认为您需要测试更新结果,并在找不到该项目时执行插入操作。 – mjhm

0

目前,这是不支持 - 因为位置操作$目前不与UPSERT工作。请投票SERVER-3326

解决方法可能是重新审视架构设计或多个操作(您不使用upsert) - 并检查更新的项目数。你要小心不要打了一个竞争条件如:

  1. 请在{keywords: {$exists: true}}
  2. 如果更新返回0的更新 - 没有关键字执行UPSERT:其中{keywords: {$exists: false}}
  3. 如果更新返回0 - 有一场比赛和有人添加关键字现在可以执行步骤1.