2015-07-10 31 views
0

我有一个集合与文件是这样的:有条件移除嵌套子文档中的文件阵列MongoDB的

{ 
    "_id" : "ABC", 
    "Name" : "Rajesh", 
    "createstmp" : ISODate("2015-06-22T17:09:16.705Z"), 
    "updstmp" : ISODate("2015-06-22T19:31:53.527Z"), 
    "AvgValue" : "65", 
    "PreValues" : [ 
     { 
      "Date" : 20150709, 
      "Rate" : [ 
       { 
        "Time" : 1566, 
        "value" : 60 
       }, 
       { 
        "Time" : 1500, 
        "value" : 400 
       }, 
       { 
        "Time" : 1400, 
        "value" : 100 
       }, 
       { 
        "Time" : 1500, 
        "value" : 103 
       } 
      ] 
     } 
    ] 
} 

我想删除重复的文档特定日期值 例如,如果时间值是1500,我需要在单个批量操作中提取文档并将其推到(Value)的新值。

这里是我的查询

bulk.find({ "_id":"ABC" }) 
    .update(
     { 
      "_id": "ABC", 
      "PreValues": { "Date": 20150709 } 
     }, 
     { 
      $pu‌​ll: { "PreValues": { "Rate": { "Time": 1000 } } } 
     } 
    ); 
bulk.find({ "_id":"ABC" }) 
    .update(
     { "_id": "ABC","PreValues": { "Date": 20150709 }}, 
     { $pu‌​sh : { 
      "PreValues": { "Rate": { "Time": 1000,"Rating": 100 }} 
     }} 
    ); 
bulk.execute(); 

回答

0

这不是一个好主意嵌套阵列,因为你将永远能够原子做的唯一事情就是$push$pull。请参阅positional $ operator了解为什么“嵌套数组”在这里不好,但基本上只能匹配“外部”数组元素的位置。

这基本上是你错过了什么在这里,当然适当的“点号”为访问内容:

var bulk = db.ABA.initializeOrderedBulkOp(); 
bulk.find({ "_id": "ABC", "PreValues.Date": 20150709 }) 
    .updateOne({ "$pull": { "PreValues.$.Rate": { "Time": 1500 } } }) 
bulk.find({ "_id": "ABC", "PreValues.Date": 20150709 }) 
    .updateOne({ "$push": { "PreValues.$.Rate": { "Time": 1500, "Rating": 100 } } }) 
bulk.execute(); 

哪些改变,如文档,以便:

{ 
    "_id" : "ABC", 
    "Name" : "Rajesh", 
    "createstmp" : ISODate("2015-06-22T17:09:16.705Z"), 
    "updstmp" : ISODate("2015-06-22T19:31:53.527Z"), 
    "AvgValue" : "65", 
    "PreValues" : [ 
      { 
        "Date" : 20150709, 
        "Rate" : [ 
          { 
            "Time" : 1566, 
            "value" : 60 
          }, 
          { 
            "Time" : 1400, 
            "value" : 100 
          }, 
          { 
            "Time" : 1500, 
            "Rating" : 100 
          } 
        ] 
      } 
    ] 
} 

那是这两种语句的正确语法,并通过单个响应同时向服务器发送两个请求。

请注意,您需要在.find()查询中包含一个来自外部数组的字段以进行匹配。这是因为positional $ operator填充了该元素的匹配索引,并且运算符知道要对哪个数组元素执行操作。

+0

@VinaySawant请不要在评论中发布代码清单。基本上,您需要使用代码,因为我已经为它提供了适合您要匹配的文档和元素的正确值。这里的教训是1.批量操作的正确语法,2.在查询条件中匹配要正确更新的数组元素。 3.在点更新中使用“点符号”和位置操作符 –

+0

@VinaySawant我刚刚通过shell运行了所有内容,并将这些命令发回到了这里,以防输入错误。还增加了如何修改您在问题中提供的示例。正如你所看到的结果,其他值匹配“1500”的数量已经消失,只有新的数组元素现在被添加到数组中。 –

+0

@VinaySawant当然有用。我刚刚告诉过你,代码和你的数据样本一起被剪切/放入,并产生如图所示的结果。如果它不适合你,那么你正在做一些不同于这里的例子。把你自己的示例数据放到一个测试集合中,复制并粘贴我在这里的代码(因为shell不喜欢它而没有缩进)并亲自查看。也。不是一个“人”,你也不应该做出这些假设。 –