MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Аналог за група concat в sql

Според коментарите досега не е ясно какво групирате или какво искате като краен резултат, освен да кажете, че искате датите ви да бъдат свързани в нещо като „само деня“ без часове или минути заедно. Вероятно искате тези отделни дни с някаква цел.

Има различни оператори за дата в процес, който можете да използвате на дати, и е $concat оператор също. За съжаление всички оператори за дата създайте цяло число като техен резултат и за типа низ от дата, който искате, $concat ще работи само с низове. Другият проблем е, че не можете да каствате цялото число в тип низ в рамките на агрегацията.

Но виеможете използвайте поддокументи, тук ще работим само с датата:

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

Така че, това не е низ, но може лесно да бъде обработен след това в такъв, но най-важното е, че е групиран и подлежи на сортиране.

Принципите остават същите, ако искате уникалните dates по този начин като масив в края или дали искате да групирате суми по тези дати. Така че основно имайте предвид частите $unwind и $project, използващи операторите за дата.

--РЕДАКТИРАНЕ--

С благодарност към общността, както е показано в тази публикация има това недокументирано поведение на $substr , в който цели числа могат да бъдат преобразувани като низове.

db.record.aggregate([
    // Unwind the array to work with it
    {$unwind: "$date"},

    // project into our new 'day' document
    {$project:{ 
        day: { 
            year: {$year: "$date"},
            month: {$month: "$date"}, 
            day: {$dayOfMonth: "$date"}
        }
     } },

     // optionalally sort if date order is important [ oldest -> newest ] 
     {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},

     // now we are going to project to a string ** magic @heinob **
     {$project: { 
         day: {$concat: [
             {$substr: [ "$day.year", 0, 4 ]},
             "-",
             {$substr: [ "$day.month", 0, 2 ]},
             "-",
             {$substr: [ "$day.day", 0, 2 ]}
         ]}
     }},

     // Wind back unique values into the array
     {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
])

А сега days са низове. Както отбелязах преди, ако подреждането е важно за вас, тогава най-добрият подход е да проектирате в тип документ, както беше направено, и да сортирате по цифровите клавиши. Естествено $project, който трансформира датата, може да бъде навит в етапа $group за краткост, което вероятно е това, което искате да направите, когато работите с целия документ.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Конвертиране на DBObject в Java Object при извличане на стойности от MongoDB

  2. В MongoDb, как да приложите вътрешни полета за сортиране, присъстващи в документа?

  3. spring-mongo-1.0.xsd грешка

  4. MongoDB или CouchDB - годни за производство?

  5. Как да се присъедините към две допълнителни колекции с условия