Поле массива Concat внутри массива объекта в одно строковое поле в агрегате mongodb - PullRequest
1 голос
/ 11 апреля 2020

Я хотел бы объединить значения полей массива внутри массива объектов в одно строковое поле. Вот существующий формат документа:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"), 
  "notes" : [
    {
        "_id" : ObjectId("5b55aabe0550de0021097bf0"),  
        "term" : "BLA BLA"
    }, 
    {
        "_id" : ObjectId("5b55aabe0550de0021097bf1"), 
        "term" : "BLA BLA BLA"
    }, 
    {
        "_id" : ObjectId("5b55aabf0550de0021097ed2"), 
        "term" : "BLA"
     }
  ], 
   "client" : "John Doe"
}

Требуемый формат документа:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"),  
  "notes" : "BLA BLA \n BLA BLA BLA \n BLA",
  "client" : "John Doe"
}

Попытка с $ project:

 { "$project": {    
      "notes": { 
            "$map": { 
                "input": "$notes", 
                "as": "u", 
                  "in": { 
                      "name": { "$concat" : [ "$$u.term", "\\n" ] } 
                  } 
             }
         }
     }
 }

, но это возвращает это:

{ 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000"),  
  "client" : "John Doe"
  "notes" : [
    {
        "name" : "BLA \n"
    }, 
    {
        "name" : "BLA BLA \n"
    }, 
    {
        "name" : "BLA BLA BLA \n"
    }
  ]
}

Как получить его в нужном формате? Любая идея была бы оценена!

Редактировать:

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

Существующий формат:

{
   "sale" : { 
       "bills" : [
        {
            "billNo" : "1234567890", 
            "billAmt" : NumberInt(1070), 
            "tax" : NumberInt(70) 
          }
       ]
    }, 
  "no" : "123456789",  
  "date" : ISODate("2020-04-01T05:19:02.263+0000")

} ​​

Требуется:

{
 "no" : "123456789",  
 "date" : ISODate("2020-04-01T05:19:02.263+0000"),
 "total" : NumberInt(1140)
}

1 Ответ

0 голосов
/ 11 апреля 2020

Вы можете использовать $ redu * для преобразования массива строк в одну строку:

db.collection.aggregate([
    {
        $addFields: {
            notes: {
                $reduce: {
                    input: "$notes.term",
                    initialValue: "",
                    in: {
                        $cond: [ { "$eq": [ "$$value", "" ] }, "$$this", { $concat: [ "$$value", "\n", "$$this" ] } ]
                    }
                }
            }
        }
    }
])

Пн go Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...