Добавить дату ко всем записям в коллекции в порядке возрастания, используя конвейер агрегации mongodb. - PullRequest
0 голосов
/ 08 апреля 2020

возможно ли в совокупности добавить даты для всех записей с определенной даты

[
 {
    _id: "bmasndvhjbcw",
    name: "lucas",
    occupation: "scientist",
    present_working:true,
    age: 55,
    location: "texas",


  },
  {
    _id: "bmasndvhjbcx",
    name: "mark",
    occupation: "scientist",
    age: 45,
    present_working:true,
    location: "texas",

  },
  {
    _id: "bmasndvhjbcq",
    name: "cooper",
    occupation: "physicist",
    age: 69,
    location: "texas",

  }
]

есть ли способ добавить даты для всех записей с этой даты date:2019-11-25T01:00:00.000+00:00 в порядке возрастания, например

[
 {
    _id: "bmasndvhjbcw",
    name: "lucas",
    occupation: "scientist",
    present_working:true,
    age: 55,
    location: "texas",
    date:2019-11-25T01:00:00.000+00:00


  },
  {
    _id: "bmasndvhjbcx",
    name: "mark",
    occupation: "scientist",
    age: 45,
    present_working:true,
    location: "texas",
    date:2019-11-26T01:00:00.000+00:00

  },
  {
    _id: "bmasndvhjbcq",
    name: "cooper",
    occupation: "physicist",
    age: 69,
    location: "texas",
    date:2019-11-27T01:00:00.000+00:00

  }
]

mongodb версия 4.0

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Это можно сделать с помощью следующего запроса:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      docs: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: {
      path: "$docs",
      includeArrayIndex: "index"
    }
  },
  {
    $addFields: {
      "docs.date": {
        $add: [
          {
            $dateFromString: {
              dateString: "2019-11-25T01:00:00.000"
            }
          },
          {
            $multiply: [
              "$index",
              {
                $multiply: [
                  24,
                  60,
                  60,
                  1000
                ]
              }
            ]
          }
        ]
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$docs"
    }
  }
])

Проверьте это здесь

1 голос
/ 08 апреля 2020

Эта агрегация получает ожидаемый результат:

THIS_DATE = ISODate("2019-11-25T01:00:00.000+00:00")

db.collection.aggregate( [
  { 
      $group: { 
          _id: null, 
          docs: { $push: "$$ROOT" } 
      } 
  },
  { 
      $project: { 
         _id: 0,
         docs: { 
             $map: {
                 input: { $range: [ 0, { $size: "$docs" } ] },
                 in: {
                     $mergeObjects: [ 
                         { date: { $add: [ THIS_DATE, { $multiply: [ "$$this", 24*60*60*1000 ] } ] } },
                         { $arrayElemAt: [ "$docs", "$$this" ] }
                     ]
                 }
             }
         }
      }
  },
  { 
      $unwind: "$docs" 
  },
  { 
      $replaceRoot: { newRoot: "$docs" } 
  }
] )
...