2017-03-09 66 views
0

想要使用Mongoose Model.findOneAndUpdate()仅在数组中的每个子文档都具有特定字段和值时才能找到文档。如果数组中的每个子文档都具有特定字段和值,则Mongoose返回文档

在下面的示例1中,我想对查找查询进行构建,以便它检查数组中每个子文档的日期是:“星期一”和计数:0.该查询将匹配文档并使其可用于更新。

但是相同的查询不能用于例子2,因为子文档groupB的日期是:'Tuesday',所以没有文档将被返回进行更新。

Example 1 --> 
{ 
    count: 0; 
    groupOffDays: [ 
    { 
     group: A, 
     day: 'Monday' 
    }, 
    { 
     group: B, 
     day: 'Monday' 
    }, 
    { 
    group: C, 
    day: 'Monday' 
    }, 
    ] 
} 

Example 2 --> 
{ 
    count: 0; 
    groupOffDays: [ 
    { 
     group: A, 
     day: 'Monday' 
    }, 
    { 
     group: B, 
     day: 'Tuesday' <--match fails as sub doc does not have a value of Monday 
    }, 
    { 
    group: C, 
    day: 'Monday' 
    }, 
    ] 
} 
+0

发表您的查询,你已经尝试 –

+0

最早是给它在蒙戈外壳一试(前猫鼬尝试它),看我怎么能找到与过滤器的应用对象 - >'代码db.mycoll .find({groupOffDays:{$ all:[{“$ elemMatch”:{day:“Monday”}}]}})'即使数组中的一个元素符合条件,也会返回对象,正在寻找一种方法请不要重复示例2的文档。 –

+0

如果您可以将结构调整为关键值对,则可以轻松完成。类似于'groupOffDays':{group:'A',day:'Monday'} ]',您可以使用聚合。让我知道你的想法。 – Veeram

回答

0

您可以尝试$redact,如果它找到与给定过滤器匹配的条目,它将保留整个文档。

$map项目基础上,过滤器为每个groupOffDays为布尔数组和$allElementsTrue的真,假值将检查在阵列前面的布尔值,每个文档,如果所有数组的值是true,否则返回false返回真和$redact将使用上面的booelan值进行比较;保留真值和删除文档的错误值。

db.mycoll.aggregate([{ 
    $redact: { 
     $cond: [{ 
      $allElementsTrue: { 
       $map: { 
        input: "$groupOffDays", 
        as: "group", 
        in: { 
         $cond: [{ 
           $eq: ["$$group.day", 'Monday'] 
          }, 
          true, 
          false 
         ] 
        } 
       } 
      } 
     }, "$$KEEP", "$$PRUNE"] 
    } 
}]); 
相关问题