2017-02-17 2 views
2

У меня есть записи, как следующее:

{ _id : 1 , data : [7,4,0] } 

{ _id : 2 , data : [4,5,6] } 

{ _id : 3 , data : [6,7,8] } 

Я хочу объединения в массив двух данных.

Например, если я хочу найти объединение массива данных идентификатора 1 и 2, запрос я использую:

db.coll.aggregate(
{ 
    $match : { 
     _id: { $in: [1, 2] } 
    } 
}, 
{ 
    $group: { 
     _id: 0, 
     s0: { $first: "$data"}, 
     s1: { $first: "$data"} 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     ans: { $setUnion: [ "$s0","$s1"]} 
    } 
} 
).pretty() 

Но ответ только

{7, 5, 0}

который является данными только идентификатора 1.

Как добиться объединения между двумя или более документами на одном поле массива?

PS: Я использую MongoDB 3.4

ответ

6

Для более эффективного запроса используйте оператор $reduce, чтобы сгладить массивы. Это позволит вам конкатенировать любое количество массивов, поэтому вместо простого объединения двух массивов из документов 1 и 2 это также применимо и к другим массивам.

Рассмотрим выполнить следующую операцию: совокупный

db.coll.aggregate([ 
    { "$match": { "_id": { "$in": [1, 2] } } }, 
    { 
     "$group": { 
      "_id": 0, 
      "data": { "$push": "$data" } 
     } 
    }, 
    { 
     "$project": { 
      "data": { 
       "$reduce": { 
        "input": "$data", 
        "initialValue": [], 
        "in": { "$setUnion": ["$$value", "$$this"] } 
       } 
      } 
     } 
    } 
]) 

Пример вывода

{ 
    "_id" : 0, 
    "data" : [ 0, 4, 5, 6, 7 ] 
} 
+0

Что делать, если я хочу выполнить пересечение, тогда начальное значение будет пустым, а результат будет пустым, а input - вложенным массивом – Ars

1

просто использовать $last вместо $first для s1

поэтому запрос становится:

db.coll.aggregate(
{ 
    $match : { 
     _id: { $in: [1, 2] } 
    } 
}, 
{ 
    $group: { 
     _id: 0, 
     s0: { $first: "$data"}, 
     s1: { $last: "$data"} 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     ans: { $setUnion: [ "$s0","$s1"]} 
    } 
} 
).pretty() 

выход:

{ "ans" : [ 0, 4, 5, 6, 7 ] } 
+0

Спасибо! Это работает. Что делать, если я хочу объединить более двух документов? Каким будет групповой блок, если я хочу объединить данные id 1,2 и 3? –

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