Объедините два массива, где оба элемента не равны NULL в MongoDB

1

проблема

Я бы хотел получить два одинаково больших массива, где оба не содержат null элементы.

Подход

Я могу успешно вернуть два массива, но они содержат null значения. Когда я исключаю null значения, они, конечно, не одинаково длинны.

aggregate([
  {
    $unwind: '$row'
  }, {
    $match: {
      $or: [{
        'row.identifier': 'fah'
      }, {
        'row.identifier': 'agr'
      }]
    }
  }, {
    $group: {
      _id: '$row.identifier',
      rows: {
        $push: '$row.value'
      }
    }
  }
]

Результат

[[5, null, 64, 34, 1], [53, 31, null, null, 7]]

null значения все еще присутствуют.

Требуемый результат:

[[5, 1], [53, 7]]

null значения и значения в одном и том же индексе удаляются.


1. Обновление

Вот два примера документов по запросу:

[{ // 1st
  row: [{
    value: 53,
    identifier: 'agj'
  }, {
    value: 51,
    identifier: 'hrw'
  }, {
    value: null,
    identifier: 'rgs'
  }]
}, { // 2nd
  row: [{
    value: null,
    identifier: 'agj'
  }, {
    value: 72,
    identifier: 'hrw'
  }, {
    value: 11,
    identifier: 'rgs'
  }]
}]
  • 0
    Можете ли вы показать некоторые образцы документов путем редактирования вашего вопроса?
  • 0
    @chridam Я добавил два примера документов.
Показать ещё 1 комментарий
Теги:
mongodb-query
aggregation-framework

1 ответ

0

Возможно, есть способ сделать эту фильтрацию в mongodb, я не знаком с этим. Но в javascript вы можете написать функцию фильтра, такую как:

var notNullFilter = function(inputs){
    var outputs = [];
    for (var i=0; i<inputs.length; i++){
        outputs.push([]);
    }
    for (var k=0; k<inputs[0].length; k++){
        var isNull = false;
        for (var j=0; j<inputs.length; j++){
            if (inputs[k][j] == null){
                isNull = true;
                break;
            }
        }
        if (!isNull){
            for (var l=0; l<inputs.length; l++){
                outputs[l].push(inputs[l][k]);
            }
        }
    }
};

Если бы вы использовали библиотеку lodash, это было бы намного проще, но эта функция должна работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню