Как только вы определили свою схему / модель сбора (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] } } }])
Шаги:
- С помощью
$addFields
мы добавляем новое поле с именем count
для всех документов. - Давайте начнем с внутреннего оператора
$split
, который разделит строку на основе разделителя ,
. Итак, массив элементов, разделенных ,
Пример: - 'a,b,c'
до [a,b,c]
. - Затем мы проверяем размер массива, используя
$size
Так что он вернет 3
для вышеприведенного примера (a, b, c как три элемента). - Наконец
$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
}
Ссылка: агрегация