【问题标题】:MongoDB get values from array in modelMongoDB从模型中的数组获取值
【发布时间】:2014-11-24 17:33:08
【问题描述】:

这是文档结构:

{  
   "_id":ObjectId("547366945785c02a7c993aaa"),
   "RECNUM":"6310",
   "ART_NR":"6385",
   "ART_NRA":"11207604",
   "ART_BEZ":{  
      "fr":"Coffret cadeau"
   },
   "BES1":{  
      "fr":"Service a fondue"
   },
   "markings":[  
      "CH-TP2",
      "CH-WZ1",
      "",
      "EU-PAD002",
      "",
      ""
   ]
}

我需要从与正则表达式匹配的标记数组中获取所有值:

'/^EU-/i'

对于给定的_id。因此,在这种情况下,回报如下:

{"markings": ["EU-PAD002"]}

我不知道如何进行这种查询,因为我对 MongoDB 完全陌生。

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以利用aggregation framework 来实现您想要的。

    db.mycollection.aggregate([
        // Filter only those documents that at least have one match
        {"$match": {markings:/^EU-/i}}, 
        // De-normalize the markings array
        {"$unwind": "$markings"}, 
        // Filter all documents that match the reg exp
        {"$match": {markings:/^EU-/i}}, 
        // Re-construct the array
        {"$group": {_id:"$_id", markings:{$push:"$markings"}}}
    ])
    

    输出:

    {
            "result" : [
                    {
                            "_id" : ObjectId("547366945785c02a7c993aaa"),
                            "markings" : [
                                    "EU-PAD002"
                            ]
                    }
            ],
            "ok" : 1
    }
    

    注意:如果您不希望结果中出现 _id,可以将另一个 $project 阶段添加到聚合管道。

    【讨论】:

      【解决方案2】:

      如果您只想要markings,您可以使用$projection 或使用aggregate

      投影

      db.coll.find({markings:{$regex:/^EU/ , $options:'i'}},{_id:0,markings:1})
      

      聚合

      db.coll.aggregate([
      {
        $match:{markings:/^EU-/i}
      },{
          $unwind:"$markings"
      },{
            $match:{markings:/^EU-/i}
      },{
          $group:{
              _id:null,
              markings:{$push:"$markings"}
          }
      },{
          $project:{
              _id:0,
              markings:1
        }        
      }    
      ])
      

      结果:

      {
          "result" : [ 
              {
                  "markings" : [ 
                      "EU-PAD002"
                  ]
              }
          ],
          "ok" : 1
      }
      

      查找有关 $regex http://docs.mongodb.org/manual/reference/operator/query/regex/ 和聚合 http://docs.mongodb.org/manual/aggregation/ 的内容

      【讨论】:

      • 您的查询将返回整个文档,而不仅仅是匹配的数组元素。
      • @AnandJayabalan 抱歉,我没听懂!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多