Подсчет слов в массиве - как я могу запросить с помощью mon go? - PullRequest
0 голосов
/ 05 августа 2020
"sourceList": [
        {
           "source" : "hello world, how are you?",
           "_id" : ObjectId("5f0eb9946db57c0007841153")
        },
        {
           "source" : "hello world, I am fine",
           "_id" : ObjectId("5f0eb9946db57c0007841153")
        },
        {
           "source" : "Is it raining?",
           "_id" : ObjectId("5f0eb9946db57c0007841153")
        }
]

Всего слов в hello world, how are you? = 5, в hello world, I am fine = 5 и в Is it raining? = 3.

Таким образом, общее количество слов = 13

Есть ли запрос mon go для этого расчета? Я мог бы сделать это, используя javascript, но есть ли прямой способ запроса через mon go?

EDIT

Есть ли способ сделать этот запрос по документам? Для документов, удовлетворяющих критериям c, я хочу выполнить аналогичный расчет с добавленным ограничением, чтобы слова из повторяющихся предложений не учитывались дважды. Например,

Документ - 1

"sourceList": [
    {
       "source" : "hello world, how are you?",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    },
    {
       "source" : "hello world, I am fine",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    },
    {
       "source" : "Is it raining?",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    }
]

Документ - 2

  "sourceList": [
    {
       "source" : "hello world, how are you?",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    },
    {
       "source" : "hello world, I am fine",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    },
    {
       "source" : "Is it raining?",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    }
]

Здесь счетчик остается прежним. Причина в том, что предложения в обоих документах одинаковы. Но если мы объединим Документ 1 + Документ 3 (полученный следующим образом)

"sourceList": [
    {
       "source" : "Look at the beautiful tiger!",
       "_id" : ObjectId("5f0eb9946db57c0007841153")
    }
]

, количество получится как 13 + 5 (документ 3) = 18.

1 Ответ

2 голосов
/ 05 августа 2020

Да, вы можете сделать это с помощью мощного агрегатного фреймворка.

mon go play -ground

db.collection.aggregate([
  {
    "$unwind": "$sourceList" //For each array element
  },
  {
    $project: {
      "sp": {
        $split: [
          "$sourceList.source", //split by spaces
          " "
        ]
      }
    }
  },
  {
    "$project": {
      "sizes": {
        "$size": "$sp". //count the words in each array
      }
    }
  },
  {
    "$group": {
      "_id": "$_id",
      "count": {
        "$sum": "$sizes" //group by id to reverse unwind and add the sizes
      }
    }
  }
])

Обновление:

play

db.collection.aggregate([
  {
    "$unwind": "$sourceList"
  },
  {
    $project: {
      "sp": {
        $split: [
          "$sourceList.source",
          " "
        ]
      }
    }
  },
  {
    "$project": {
      "sizes": {
        "$size": "$sp"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": "$sizes"
      }
    }
  }
])

Для огромных коллекций вам может потребоваться использовать allowDiskUse, но это очень тяжелая операция для больших коллекций.

Обновление:

воспроизведение

db.collection.aggregate([
  {
    "$unwind": "$sourceList"
  },
  {
    $project: {
      "sp": {
        $split: [
          "$sourceList.source",
          " "
        ]
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "elements": {
        $addToSet: "$sp"
      }
    }
  },
  {
    "$unwind": "$elements"
  },
  {
    "$project": {
      "sizes": {
        "$size": "$elements"
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "count": {
        "$sum": "$sizes"
      }
    }
  }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...