Arrays 有条件地删除嵌套在文档MongoDB数组中的子文档

Arrays 有条件地删除嵌套在文档MongoDB数组中的子文档,arrays,mongodb,mongodb-query,Arrays,Mongodb,Mongodb Query,我收集了一份文件,如下所示: { _id:ABC, 姓名:拉杰什, createstmp:ISODate2015-06-22T17:09:16.705Z, updstmp:ISODATE 2015-06-22T19:31:53.527Z, 平均值:65, 前值:[ { 日期:20150709, 比率:[ { 时间:1566, 价值:60 }, { 时间:1500,, 价值:400 }, { 时间:1400,, 数值:100 }, { 时间:1500,, 价值:103 } ] } ] } 我

我收集了一份文件,如下所示:

{ _id:ABC, 姓名:拉杰什, createstmp:ISODate2015-06-22T17:09:16.705Z, updstmp:ISODATE 2015-06-22T19:31:53.527Z, 平均值:65, 前值:[ { 日期:20150709, 比率:[ { 时间:1566, 价值:60 }, { 时间:1500,, 价值:400 }, { 时间:1400,, 数值:100 }, { 时间:1500,, 价值:103 } ] } ] } 我想删除特定日期值的重复文档 例如,如果时间值为1500,我需要在单批量操作中拉取文档并将其推送到新值

这是我的问题

bulk.find{u id:ABC} 使现代化 { _id:ABC, 前值:{日期:20150709} }, { $pu‌​ll:{PreValues:{Rate:{Time:1000}} } ; bulk.find{u id:ABC} 使现代化 {{u id:ABC,PreValues:{Date:20150709}}, {$pu‌​sh:{ 前值:{速率:{时间:1000,评级:100} }} ; 批量执行;
使用嵌套数组不是一个好主意,因为您唯一能够以原子方式执行的操作是$push或$pull。有关嵌套数组不好的原因的详细信息,请参见,但基本上只能匹配外部数组元素的位置

这基本上就是你在这里缺少的,当然还有访问元素的正确点符号:

var bulk=db.ABA.initializeOrderedBulkOp; bulk.find{u id:ABC,PreValues.Date:20150709} .updateOne{$pull:{PreValues.$.Rate:{Time:1500}} bulk.find{u id:ABC,PreValues.Date:20150709} .updateOne{$push:{PreValues.$.Rate:{Time:1500,Rating:100}} 批量执行; 这会对文档进行如下更改:

{ _id:ABC, 姓名:拉杰什, createstmp:ISODate2015-06-22T17:09:16.705Z, updstmp:ISODATE 2015-06-22T19:31:53.527Z, 平均值:65, 前值:[ { 日期:20150709, 费率:[ { 时间:1566, 价值:60 }, { 时间:1400,, 数值:100 }, { 时间:1500,, 评级:100 } ] } ] } 这是这两个语句的正确语法,并用一个响应同时将两个请求发送到服务器


请注意,您需要在.find查询中包含外部数组中要匹配的字段。因此,将使用该元素的匹配索引填充,并且操作员知道要对哪个数组元素进行操作。

@VinaySawant请不要在注释中发布代码列表。基本上,您需要使用代码,因为我为它提供了适合于您想要匹配的文档和元素的正确值。这里的教训是1。批量操作的正确语法,2。在查询条件中匹配要正确更新的数组元素。3.点表示法和位置运算符在图形中的使用updates@VinaySawant我只是在shell中运行了所有内容,并将命令发布到这里,以防它们出现任何键入错误。还添加了如何修改您在问题中提供的示例。正如您所看到的,与1500个数量匹配的其他值消失了,现在只将新的数组元素添加到数组中。@VinaySawant当然可以。我刚刚告诉过您,代码与您的数据样本一起被剪切/转换,并生成如图所示的结果。如果它对你不起作用,那么你正在做一些与这里的例子不同的事情。将您自己的示例数据放入测试集合中,复制并粘贴我这里的代码,而不进行缩进,因为shell不喜欢它,您自己也可以查看。而且不是男人,你也不应该做那些假设。谢谢你的朋友,我感谢你的时间和努力。