【问题标题】:Mongo query for finding out field matching particular array key value用于查找与特定数组键值匹配的字段的 Mongo 查询
【发布时间】:2019-09-18 14:10:21
【问题描述】:

我想找出 type="Normal" 和 desc==atr.value(特定键 atr.key="UDPP" 的 atr.value)的元素。我使用的是 mongo 3.0.4,所以不能使用 $expr。下面是数据集:

JSON

   "_id":ObjectId("12345"),
   "desc":"Foo Bar",
   "type":"Normal",
   "atr":[
      {
         "key":"DSP",
         "value":"Goo Bar"
      },
      {
         "key":"UDSP",
         "value":"Foo Bar"
      }
   ],
   "prod":"yes"
}
{
   "_id":ObjectId("12347"),
   "desc":"Boo Bar",
   "type":"Normal",
   "atr":[
      {
         "key":"DSP",
         "value":"Goo Bar"
      },
      {
         "key":"UDSP",
         "value":"Foo Bar"
      }
   ],
   "prod":"yes"
}

它应该将结果作为 Ist 对象仅作为 type="Normal" 和 atr.value="Foo Bar"(for atr.key="UDSP") 和 desc="Foo Bar"

【问题讨论】:

  • 我试过这个查询不起作用:db.test.aggregate([ { $unwind:"$atr" }, { "$match":{ "atr.key":"UDSP" } }, { "$redact":{ "$cond":{ if:{ "$eq":[ "atr.value", "desc" ] }, then:"$$KEEP", else:"$$PRUNE" } } } ])

标签: mongodb mongodb-query aggregation-framework


【解决方案1】:

您可以使用此查询。首先根据条件为匹配的文档添加一个字段,并根据添加的字段进行过滤

db.test.aggregate([ 
    { $match: { type: "Normal", "atr.key":"UDSP" }},
    { $addFields:{ 
        isDocMatched: { 
          $anyElementTrue: { 
              $map:{
                  input: "$atr",
                  as: "grade",
                  in: { $eq: [ "$$grade.value", "$desc" ] }
              }
          }
       }
    }},
    { $match: { isDocMatched: true } }  
])

【讨论】:

  • 似乎 Mongo 3.0.4 不支持“$addFields”。给出错误 16436 -“无法识别的管道阶段名称:'$addFields”'
  • 然后使用 $project stage 而不是 $addFileds。也要注意包含 ROOT 元素。谢谢。
猜你喜欢
  • 1970-01-01
  • 2022-10-31
  • 2020-06-01
  • 2020-03-22
  • 2020-01-09
  • 2016-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
相关资源
最近更新 更多