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

Необходимо е да се изчисли разликата между датата и часа за полето за дата и час, записано във формат на низ в MongoDB

Вие сте написали всички етапи, но работата тук е, че няма връзка между тях, което означава, че промените, направени при предишна настройка, не се отразяват в следващите стъпки. Няколко проблема:

{$sort: {$dateFromString:{time: 1}}} // You can't use `$dateFromString` in sort stage. Also syntax of `$dateFromString` is incorrect.

Да предположим, че ако работи (няма, но предполагаме), че всъщност не преобразувате time &съхраняване на преобразуваното време в променлива за по-късна употреба в $group или по-надолу етапи. Така че трябва да го съхраните в променлива в съответния документ, като използвате $addFields или $project . Не съм стигнал по-надолу, но можете да опитате по-долу със заявката:

Запитване:

db.collection.aggregate([
    /** sort on `time` field */
    { $sort: { time: 1 } },
    /** Convert string format of `time` field to milliseconds & store to `convertedTime` field for each doc */
    { $addFields: { convertedTime: { $toLong: { $dateFromString: { dateString: "$time" } } } } },
    /** Group without condition to push all documents into `docs` array */
    {
      $group: { _id: "", docs: { $push: "$$ROOT" } }
    },
    /** re-creating `docs` array */
    {
      $project: {
        _id: 0,
        docs: {
          $reduce: {
            input: { $slice: [ "$docs", 1, { $size: "$docs" } ] }, /** Pick `docs` array without first element for iteration */
            initialValue: {  docObj: [ { $arrayElemAt: [ "$docs", 0 ] } ], previousTime: { $arrayElemAt: [ "$docs.convertedTime", 0 ] } },
            in: {
              docObj: { $concatArrays: [ "$$value.docObj", [
                    { $mergeObjects: [ "$$this", { time_difference: { $divide: [ { $subtract: [ "$$this.convertedTime", "$$value.previousTime" ] }, 1000 ] } } ] }
                  ]
                ]
              },
              previousTime: "$$this.convertedTime" // Store current doc's time to `previousTime` to utilize for next record
            }
          }
        }
      }
    },
    {
      $unwind: { path: "$docs.docObj" }
    },
    /** Remove additionally added field */
    {
      $project: { "docs.docObj.convertedTime": 0 }
    },
    /** Replace root of the doc with `docs.docObj` */
    {
      $replaceRoot: { newRoot: "$docs.docObj" }
    }
  ])

Тест: mongoplayground

Справка: aggregation-pipeline

Забележка: Тази заявка няма да добави "time_difference" :null за първи документ, но за всеки случай, ако е необходимо, опитайте това в initialValue :docObj: [ {$mergeObjects :[ { $arrayElemAt: [ "$docs", 0 ] }, { "time_difference" :null } ] ] . Също така бих предложил да ограничите тази операция до определени документи в колекцията с помощта на $match като първи етап, вместо да правите тази заявка за всички документи причина

{
   $group: { _id: "", docs: { $push: "$$ROOT" } }
}

само по себе си ще бъде огромно нещо, когато се направи върху цялата колекция с огромен набор от данни.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Работа с уникални, редки, съставни индекси на mongodb

  2. MongoDB срещу CouchDB (оптимизиране на скоростта)

  3. Намиране на MongoDb Spring във вложен обект

  4. Кой е най-добрият метод за зареждане на приложение Node / MongoDB?

  5. MongoDB агрегиране на Loopback