MongoDb сортировка по полю даты с $ match и $ project не работает - PullRequest
1 голос
/ 06 ноября 2019

Я не вижу какой-либо сортировки в моих данных при сортировке по полю даты в запросах mongoDb. Поле «date_recorded» является полем даты.

Я также пытался сортировать по полю time_stamp. Похоже, что порядок сортировки не работает независимо от того, идет ли он по возрастанию или по убыванию.

Не могу понять, почему он не работает. Я попробовал это в: - Компас, используя вкладку Aggregate. - Robo3t - VSCode с использованием NodeJs (запрос модели схемы)

Вывод всегда одинаков.

Любая помощь, чтобы получить эту работу будет принята с благодарностью ...

Я искал в Google и пробовал разные вещи около двух часов.


Вот мой запрос:

db.getCollection('inputData').aggregate(
    { $match: { "inputData_userID": { $eq: "user1" } } }
    ,{ $project: { "date": 1 }}
    ,{ $sort: { "date_recorded": -1 }}
    ,function (err, docs) {}
)



Это вывод:

/* 1 */
{
    "_id" : "0f30df7453b6096da524d3b61ce75eb1",
    "date" : "4/13/2017"
}

/* 2 */
{
    "_id" : "081be472b94804ae597706aa2bc4d9f4",
    "date" : "4/18/2017"
}

/* 3 */
{
    "_id" : "0005933cda516a4df346bf0807ab6ca4",
    "date" : "5/19/2017"
}

/* 4 */
{
    "_id" : "3a67cc9a5eb0a9197fa5448773bfec88",
    "date" : "4/14/2017"
}

/* 5 */
{
    "_id" : "1aefe9e79faaf4d65c6194b162311e08",
    "date" : "4/13/2017"
}

/* 6 */
{
    "_id" : "3f4c9d65c207d5cf620a00cee062a4c8",
    "date" : "4/13/2017"
}



Вот еще один запрос:

db.getCollection('inputData').find(
    { "inputData_userID": { $eq: "user1" } } 
    ,{ "_id": 0, "date": 1, "date_recorded": 1 }
    ,{ $sort: { "date_recorded": -1 }}
)



Вот результат вывода этого запроса:

/* 1 */
{
    "date_recorded" : ISODate("2017-04-13T08:54:24.024Z"),
    "date" : "4/13/2017"
}

/* 2 */
{
    "date_recorded" : ISODate("2017-04-18T22:01:20.767Z"),
    "date" : "4/18/2017"
}

/* 3 */
{
    "date_recorded" : ISODate("2017-05-19T00:03:03.081Z"),
    "date" : "5/19/2017"
}

/* 4 */
{
    "date_recorded" : ISODate("2017-04-14T06:12:55.320Z"),
    "date" : "4/14/2017"
}

/* 5 */
{
    "date_recorded" : ISODate("2017-04-13T23:53:22.692Z"),
    "date" : "4/13/2017"
}

/* 6 */
{
    "date_recorded" : ISODate("2017-04-13T08:55:38.721Z"),
    "date" : "4/13/2017"
}

Ответы [ 3 ]

2 голосов
/ 07 ноября 2019

Выходные данные одного этапа конвейера агрегации обеспечивают входные данные для следующего этапа, поэтому необходимо включить date_recorded в свой этап $project, чтобы можно было отсортировать его на следующем этапе $sort. Но вам также нужно поместить ваши этапы в массив вместо предоставления их в качестве отдельных параметров:

db.getCollection('inputData').aggregate([
     { $match: { inputData_userID: "user1" }}
    ,{ $project: { date: 1, date_recorded: 1 }}
    ,{ $sort: { date_recorded: -1 }}]
    ,function (err, docs) { ... }
)

Обратите внимание, что я также упростил ваше выражение $match, так как вам не нужно использовать $eq здесь.

0 голосов
/ 06 ноября 2019

В mongo-shell у меня нет проблем с сортировкой даты в совокупности.

  • это данные поля даты.

     db.inputData.find().pretty()
    

и дает пример данных, подобных этому ...

{
    "_id" : ObjectId("5dc26c292fa53037f6b559aa"),
    "date" : ISODate("2017-04-12T18:30:00Z")
}
{
    "_id" : ObjectId("5dc26cb82fa53037f6b559ab"),
    "date" : ISODate("2017-04-14T18:30:00Z")
}
{
    "_id" : ObjectId("5dc26cf72fa53037f6b559ac"),
    "date" : ISODate("2017-04-18T18:30:00Z")
}
{
    "_id" : ObjectId("5dc26d2e2fa53037f6b559ad"),
    "date" : ISODate("2018-04-18T18:30:00Z")
}
{ "_id" : ObjectId("5dc26d722fa53037f6b559ae"), "date" : "4/19/2018" }
{ "_id" : ObjectId("5dc26db12fa53037f6b559af"), "date" : "4/19/2019" }
{ "_id" : ObjectId("5dc26dca2fa53037f6b559b0"), "date" : "5/20/2019" }
  • Для этого inputData здесь агрегированный конвейер только для поля даты сортировки.

    db.inputData.aggregate([{$sort:{date:-1}}]) 
    
  • При выполнении выше агрегированных данных сортировки есть ..

         { "_id" : ObjectId("5dc26d2e2fa53037f6b559ad"), "date" : ISODate("2018-04-18T18:30:00Z") }
         { "_id" : ObjectId("5dc26cf72fa53037f6b559ac"), "date" : ISODate("2017-04-18T18:30:00Z") }
         { "_id" : ObjectId("5dc26cb82fa53037f6b559ab"), "date" : ISODate("2017-04-14T18:30:00Z") }
         { "_id" : ObjectId("5dc26c292fa53037f6b559aa"), "date" : ISODate("2017-04-12T18:30:00Z") }
         { "_id" : ObjectId("5dc26b2e2fa53037f6b559a9"), "date" : ISODate("1970-01-01T00:00:00Z") }
         { "_id" : ObjectId("5dc26dca2fa53037f6b559b0"), "date" : "5/20/2019" }
         { "_id" : ObjectId("5dc26db12fa53037f6b559af"), "date" : "4/19/2019" }
         { "_id" : ObjectId("5dc26d722fa53037f6b559ae"), "date" : "4/19/2018" }
    
  • Одна важная вещь, для поля даты, если вы хотите преобразовать его в дату из строки, вы должны запустить этот скрипт ..

         db.inputData.find().forEach(function(doc){
               doc.date = new Date(doc.date);
               db.inputData.save(doc);
         })
    
0 голосов
/ 06 ноября 2019

Ваш первый запрос и ответ.

db.getCollection('inputData').aggregate(
  [{ $match: { "_id": new mongoose.Types.ObjectId(objectId) } }
  ,{ $project: { "date": 1 }}
  ,{ $sort: { "date": -1 }}]
  ,function (err, docs) {}
)
...