尝试这个:
db.col1.aggregate([
{ $unwind:
{ path:"$arr2", includeArrayIndex: "i"}},
{ $project:
{
"arr2":1,
"arr1": { $slice: ["$arr1","$i",1] }}
},
{$unwind: "$arr1"}
{$match: { "arr1":"a" }}
])
第一个 $unwind 阶段的输出
{ "_id" : 1, "arr1" : [ "a", "a", "b", "c" ], "arr2" : 1, "i" : NumberLong(0) }
{ "_id" : 1, "arr1" : [ "a", "a", "b", "c" ], "arr2" : 4, "i" : NumberLong(1) }
{ "_id" : 1, "arr1" : [ "a", "a", "b", "c" ], "arr2" : 2, "i" : NumberLong(2) }
{ "_id" : 1, "arr1" : [ "a", "a", "b", "c" ], "arr2" : 3, "i" : NumberLong(3) }
{ "_id" : 2, "arr1" : [ "z", "a", "b", "a" ], "arr2" : 1, "i" : NumberLong(0) }
{ "_id" : 2, "arr1" : [ "z", "a", "b", "a" ], "arr2" : 4, "i" : NumberLong(1) }
{ "_id" : 2, "arr1" : [ "z", "a", "b", "a" ], "arr2" : 2, "i" : NumberLong(2) }
{ "_id" : 2, "arr1" : [ "z", "a", "b", "a" ], "arr2" : 3, "i" : NumberLong(3) }
项目二期后投入使用
{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 1 }
{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 4 }
{ "_id" : 1, "arr1" : [ "b" ], "arr2" : 2 }
{ "_id" : 1, "arr1" : [ "c" ], "arr2" : 3 }
{ "_id" : 2, "arr1" : [ "z" ], "arr2" : 1 }
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 4 }
{ "_id" : 2, "arr1" : [ "b" ], "arr2" : 2 }
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 3 }
第二个 $unwind 输出
{ "_id" : 1, "arr1" : "a", "arr2" : 1 }
{ "_id" : 1, "arr1" : "a", "arr2" : 4 }
{ "_id" : 1, "arr1" : "b", "arr2" : 2 }
{ "_id" : 1, "arr1" : "c", "arr2" : 3 }
{ "_id" : 2, "arr1" : "z", "arr2" : 1 }
{ "_id" : 2, "arr1" : "a", "arr2" : 4 }
{ "_id" : 2, "arr1" : "b", "arr2" : 2 }
{ "_id" : 2, "arr1" : "a", "arr2" : 3 }
最终 $match 输出:
{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 1 }
{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 4 }
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 4 }
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 3 }