MongoDB - 根据另一个数组筛选数组

3

我正在使用MongoDB,这是我的文档样式:

{
    "_id": 1,
   "arr1": ["a", "a", "b", "c"],
   "arr2": [1, 4, 2, 3 ],
},
{
    "_id": 2,
   "arr1": ["z", "a", "b", "a"],
   "arr2": [1, 4, 2, 3 ],
}

在键 arr1arr2 中的数组始终具有相同的长度。我想聚合数据,以便可以根据 arr1 过滤 arr2 中的值。

例如,如果我根据 arr1 进行过滤,寻找 a,那么我想得到像这样的结果:

{ "_id": 1, "arr1": "a", "arr2": 1},
{ "_id": 1, "arr1": "a", "arr2": 4 },
{ "_id": 2, "arr1": "a", "arr2": 3 },
{ "_id": 2, "arr1": "a", "arr2": 3 }

有没有用MongoDB完成这个任务的方法?
谢谢,
Uirá

请检查下面的答案。谢谢。 - Lahar Shah
1个回答

2

试试这个:

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输出

(涉及IT技术)
{ "_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 }

1
很好,它无缺陷地运行了。我也喜欢你解释这个查询的方式,展示每一步的输出。非常有教育意义。谢谢。 - ucaiado
很高兴听到这个消息。不客气。感谢您接受答案。 - Lahar Shah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接