2016-05-13 4 views
1

я использую MongoDB, и это то, что мои документы выглядят как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 ], 
} 

Массивы в ключах arr1 и arr2 всегда имеют одинаковую длину. Я хотел бы объединить данные, чтобы я мог отфильтровать значения в arr2 на основе arr1.

Например, если я фильтровать моя коллекция на основе 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á

+0

проверка ответ ниже. Спасибо –

ответ

1

Попробуйте это:

db.col1.aggregate([ 
    { $unwind: 
     { path:"$arr2", includeArrayIndex: "i"}}, 
    { $project: 
     { 
      "arr2":1, 
      "arr1": { $slice: ["$arr1","$i",1] }} 
      }, 
    {$unwind: "$arr1"} 
    {$match: { "arr1":"a" }} 
]) 

выход из первого $ размотки Stage

{ "_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 } 

второй $ размотки Выходной

{ "_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 } 

Конечный результат $ матч:

{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 1 } 
{ "_id" : 1, "arr1" : [ "a" ], "arr2" : 4 } 
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 4 } 
{ "_id" : 2, "arr1" : [ "a" ], "arr2" : 3 } 
+0

Ницца, он работал безупречно. Мне также понравилось, как вы объяснили этот запрос, показывая результаты каждого шага. Очень поучительно. Спасибо. – ucaiado

+0

рад это слышать. Добро пожаловать. Спасибо, что приняли ответ. –

 Смежные вопросы

  • Нет связанных вопросов^_^