2016-12-09 7 views
1

В массиве элементов массива агрегации из индекса x в y, где x определяется внутри коллекции, а y - элемент массива, соответствующий индексу элемента массива, который сопоставляется. Пожалуйста, смотрите ниже пример, тогда станет легче понять, что я пытаюсь сказать.Как включить внешний массив в агрегацию MongoDB?

купоны коллекция

{"coupon_id": "coupon01", "codes": ["FLAT30", "FLAT50", "FLAT70", "FLAT90"], "curr_index": 0} 

Например см ниже примере кода здесь я пытаюсь получить купон коды, начинающиеся с curr_index до (curr_index + п), где п есть число в coupon_ctrs, соответствующий индексу coupons_ids ПРИМЕР- для идентификатора "584559bd1f65d363bd5d25fd" п равно 1, для идентификатора "58455a5c1f65d363bd5d2600" п равно 2 и для идентификатора "584878eb0005202c64b0cc5d" п 3.

coupons_ctrs = [1, 2, 3]; 
coupons_ids = ["584559bd1f65d363bd5d25fd", "58455a5c1f65d363bd5d2600", "584878eb0005202c64b0cc5d"]; 

int n = 2; 
couponmodel.aggregate(
     { $match : { '_id': { $in : coupons_ids }} }, 
     { $project: {_id:0, codes : /* How to use slice here so that codes array will be returned between cur_index and (curr_index + coupons_ctr corresponding to the index coupon id is found, example- for _id "584559bd1f65d363bd5d25fd" it should be 1 and so on) */} }, 
     function(err, docs) { 
      if (err) { 

      } else { 

      } 
     }); 

UPDATE

Как предложил Styvane, я мог бы использовать $ zip, и он будет работать идеально, но поскольку я использую mongoDB 3.2.11, поэтому я не могу его использовать, так что может быть решением для использования функциональных возможностей $ zip в mongodb 3.2.11 ??

Может кто-нибудь скажет мне, как я могу включить этот массив coupon_ctrs и использовать его внутри конвейера агрегации.

ответ

1

Вам нужно применить выражение $slice к каждому элементу в массиве «coupons_ctrs» с помощью $map оператора, что означает, что мы используем буквальный «coupons_ctrs» массив как «вход» в $map.

let coupons_ids = [ 
    "584559bd1f65d363bd5d25fd", 
    "58455a5c1f65d363bd5d2600", 
    "584878eb0005202c64b0cc5d" 
]; 

let coupons_ctrs = [1, 2, 3]; 

db.couponmodel.aggregate(
    [ 
     { "$match" : { "_id": { "$in" : coupons_ids } } }, 
     { "$project": { 
      "codes": { 
       "$map": { 
        "input": coupons_ctrs, 
        "as": "n", 
        "in": { 
         "$slice": [ 
          "$codes", 
          "$curr_index", 
          { "$add": [ "$curr_index", "$$n" ] } 
         ] 
        } 
       } 
      } 
     }} 
    ] 
) 

Что дает:

{ 
    "codes" : [ 
     [ "FLAT30" ], 
     [ "FLAT30", "FLAT50" ], 
     [ "FLAT30", "FLAT50", "FLAT70" ] 
    ] 
} 

В MongoDB 3.4 мы можем использовать оператор $zip сделать это:

db.couponmodel.aggregate(  
    [ 
     { "$project": { 
      "codes": { 
       "$map": { 
        "input": { 
         "$zip": { 
          "inputs": [ coupons_ids, coupons_ctrs ] 
         } 
        }, 
        "as": "item", 
        "in": { 
         "coupon_id": { "$arrayElemAt": [ "$$item", 0 ] }, 
         "value": {   
          "$slice": [ 
           "$codes",  
           "$curr_index",  
           { "$add": [ 
            "$curr_index", 
            { "$arrayElemAt": [ "$$item", 1 ] } 
           ] }       
          ] 
         } 
        }  
       } 
      } 
     }}  
    ] 
) 

которые возвращают что-то вроде этого:

{ 
    "codes" : [ 
     { 
      "coupon_id" : "584559bd1f65d363bd5d25fd", 
      "value" : [ "FLAT30" ] 
     }, 
     { 
      "coupon_id" : "58455a5c1f65d363bd5d2600", 
      "value" : [ "FLAT30", "FLAT50" ], 
     }, 
     { 
      "coupon_id" : "584878eb0005202c64b0cc5d", 
      "value" : [ "FLAT30", "FLAT50", "FLAT70" ] 
     } 
    ] 
} 
+0

В ваш код, где определено, что для id: «584559bd1f65d363bd5d25fd» n будет 1, я имею в виду, есть ли поручительство, что для каждого идентификатора, который соответствует «n», будет тем же самым элементом индекса в «coupon_ctr». ?? –

+0

@PrakashKumar да, но вам нужно указать индекс элементов «coupons_ids», который должен быть в том же порядке, что и элементы «coupons_ctrs», как вы показали. – styvane

+0

да, это в порядке smae, но как этот код может сделать intenrally, который вы можете объяснить? –

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