2016-12-02 84 views
0

我卡在查询方案中。 我在Mongodb中有一个json结构,我将不得不根据元素“索引”查询文档。仅检索位于Mongodb中的数组的索引值中的数据

{"List" : { 
"List1" : [11,12,13,14,15,16], 
"List2" : [11,11,11,11,11,11] 
}, 
"Values" : ["APPLE", "ORANGE", "BANANA", "MANGO", "PAPAYA", "KIWI"], 
"Index" : [1,2,3,1,2,3] 
} 

过滤器应基于“索引”,它是'1',我想显示如下。

{"List" : { 
"List1" : [11,14], 
"List2" : [11,11] 
}, 
"Values" : ["APPLE","MANGO"], 
"Index" : [1,1] 
} 
下面

是我执行

db.getCollection('TEST').find({"Index": 3} , 
{ "Values": 1,"List":1,"Index": 1, "Index.$": 1} 
) 

我得到的所有数据,除了只有一个索引值,因为我给了位置参数的查询(“指数$”:1)

+0

可能重复://计算器。 com/questions/31164156/zip-arrays-with-mongodb) – styvane

回答

1

随着当前蒙戈3.4版本,你可以$zip结合$range生成的索引和域的阵列,$filter以匹配索引字段和$addFields添加到原始域。

最后一步是$map每个基于匹配索引字段与[邮编阵列用的MongoDB](HTTP $arrayElemAt

aggregate([{ 
    $addFields: { 
     match: { 
      $filter: { 
       input: { 
        $zip: { 
         inputs: ["$Index", { 
          $range: [0, { 
           $size: "$Index" 
          }] 
         }] 
        } 
       }, 
       as: "val", 
       cond: { 
        $eq: [{ 
         $arrayElemAt: ["$$val", 0] 
        }, 1] 
       } 
      } 
     } 
    } 
}, { 
    $project: { 
     "List": { 
      "List1": { 
       $map: { 
        input: "$match", 
        as: "index", 
        in: { 
         $arrayElemAt: ["$List.List1", { 
          $arrayElemAt: ["$$index", -1] 
         }] 
        } 
       } 
      }, 
      "List2": { 
       $map: { 
        input: "$match", 
        as: "index", 
        in: { 
         $arrayElemAt: ["$List.List2", { 
          $arrayElemAt: ["$$index", -1] 
         }] 
        } 
       } 
      } 
     }, 
     "Values": { 
      $map: { 
       input: "$match", 
       as: "index", 
       in: { 
        $arrayElemAt: ["$Values", { 
         $arrayElemAt: ["$$index", -1] 
        }] 
       } 
      } 
     }, 
     "Index": { 
      $map: { 
       input: "$match", 
       as: "index", 
       in: { 
        $arrayElemAt: ["$Index", { 
         $arrayElemAt: ["$$index", -1] 
        }] 
       } 
      } 
     }, 
     _id: 0 
    } 
}]).pretty(); 
+0

非常感谢,我会尽快检查并更新你。 – Sandy