0

我想尝试向数组添加更多值,但因此两个值必须匹配。我让它与一个值一起工作,但不是两个。这就是我所拥有的:

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

当我有关键字“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" } ] }

提前致谢。

4

2 回答 2

0

这似乎符合您的要求(JavaScript 语法):

    coll.update({
        "app": "494258956", 
        "keywords": {
            "$elemMatch": { "keyword": "test" }
        }
    },
    {
        "$push": {
            "keywords.$.data": {
                "device" : "software",
                "date" : new Date( 1358012599633 ),
                "rank" : 2,
                "shop" : "143443" 
            }
        }
    }
于 2013-01-13T06:46:20.690 回答
0

目前不支持此功能 - 因为位置运算符$当前不适用于 upsert。请投票给SERVER-3326

解决方法可能是重新访问不使用 upsert 的架构设计或多个操作 - 并检查更新的项目数。您必须注意不要达到比赛条件,例如:

  1. 在哪里更新{keywords: {$exists: true}}
  2. 如果 update 返回 0 - 没有关键字执行 upsert: where{keywords: {$exists: false}}
  3. 如果更新返回 0 - 有一场比赛并且有人添加了关键字现在可以执行第 1 步。
于 2013-01-30T11:23:58.020 回答