Как рассчитать указанные c символов в строке в пн goose? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть это в моей коллекции на MongoDB, поэтому мне нужно посчитать в MED0 только запятые и вернуть 4. enter image description here

Когда я делаю это в Firebase, это что-то вроде этого:

let medRef = db.ref('root/users/id1/MED0');
// change the object in an element of array
   function snapshotToArray(snapshot) {
      let returnArr = [];
      snapshot.forEach(function(childSnapshot) {
          let item = childSnapshot.val();
          item.key = childSnapshot.key;
        str= item.split(/\d+/).length;//split divide a string in an array of strings, and I use /\d+/ 
      //lenght counts the characters
          returnArr.push(str - 2); //-2 no count []
      });
      return returnArr;
  }; // on() synchronize data and snap is a snapshot of database

medRef.on('value', function(snapshot) {
    console.log(snapshotToArray(snapshot));
});

Итак, как мне сделать то же самое в Mon goose и вернуть значение из моей коллекции в MongoDB?

1 Ответ

0 голосов
/ 14 февраля 2020

Как только вы определили свою схему / модель сбора (collectionModel) в своем мон goose, вы можете сделать это, используя агрегацию :

collectionModel.aggregate([
    {
        $addFields: {
            med: {
                $map: {
                    input: '$med', as: 'each', in: {
                        $mergeObjects: ['$$each', {
                            count: {
                                $subtract: [{
                                    $size: {
                                        $split: [{
                                            $arrayElemAt: [{
                                                $let:
                                                {
                                                    vars: { valueArray: { $objectToArray: "$$each" } },
                                                    in: '$$valueArray.v'
                                                }
                                            }, 0]
                                        }, ","]
                                    }
                                }, 1]
                            }
                        }]
                    }
                }
            }
        }
    }])

Тест: MongoDB-Playground

Примечание: Поскольку у вас сложная структура, нам пришлось сделать несколько дополнительных шагов, чтобы сделать это, посмотрите это простое объяснение того, как это на самом деле сделано:

db.collection.aggregate([{ $addFields: { count: { $subtract: [{ $size: { $split: ['$stringValue', ','] } }, 1] } } }])

Шаги:

  1. С помощью $addFields мы добавляем новое поле с именем count для всех документов.
  2. Давайте начнем с внутреннего оператора $split, который разделит строку на основе разделителя ,. Итак, массив элементов, разделенных , Пример: - 'a,b,c' до [a,b,c].
  3. Затем мы проверяем размер массива, используя $size Так что он вернет 3 для вышеприведенного примера (a, b, c как три элемента).
  4. Наконец $subtract для вычитания длины минус 1, чтобы получить число из , в массиве.

Сборник документов:

/* 1 */
{
    "_id" : ObjectId("5e4631707f8bc30a75e40711"),
    "stringValue" : "123,23423,534,56,1"
}

/* 2 */
{
    "_id" : ObjectId("5e4631787f8bc30a75e40800"),
    "stringValue" : ""
}

/* 3 */
{
    "_id" : ObjectId("5e4631837f8bc30a75e40991"),
    "stringValue" : "123,1"
}

Выход:

/* 1 */
{
    "_id" : ObjectId("5e4631707f8bc30a75e40711"),
    "stringValue" : "123,23423,534,56,1",
    "count" : 4.0
}

/* 2 */
{
    "_id" : ObjectId("5e4631787f8bc30a75e40800"),
    "stringValue" : "",
    "count" : 0.0
}

/* 3 */
{
    "_id" : ObjectId("5e4631837f8bc30a75e40991"),
    "stringValue" : "123,1",
    "count" : 1.0
}

Ссылка: агрегация

...