Как извлечь данные из коллекции, используя метод find () в произвольном формате даты

1

моя схема

Customers.js

import mongoose from 'mongoose';
const Customers = mongoose.Schema({
    CustomerID: { type: String, default: "" },
    Name: { type: String, default: "" },
    Email: { type: String, default: "" },
    PhoneNumber: { type: String, default: "" },
    Join_Date: { type: Date, default: null }
}, { collection: 'Customers' });
export default mongoose.model('Customers', Customers);

мой контроллер маршрутизатора

import Customers from "./Customers";
router.post('/List_All_Customers', (req, res) => {
    Customers.find().lean().exec().then((Data) => {
        res.json({Data: Data});
    }).catch((err) => {
        console.log(err);
    });
})

Мой текущий результат

{
    Data: [
        {
            CustomerID: "6ad050d4-04ac-41f2-8c93-49f68f106889",
            Name: "Uday Kumar",
            Email: "[email protected]",
            PhoneNumber: "+91-991010191",
            Join_Date: "2018-04-24T12:00:00.000Z"
        },
        {
            CustomerID: "792b67f9-9026-43bc-9017-46cd2568b4e9",
            Name: "Prem Kumar",
            Email: "[email protected]",
            PhoneNumber: "+91-881010091",
            Join_Date: "2018-04-24T15:00:00.000Z"
        }
    ]
}

Ожидание результата

{
    Data: [
        {
            CustomerID: "6ad050d4-04ac-41f2-8c93-49f68f106889",
            Name: "Uday Kumar",
            Email: "[email protected]",
            PhoneNumber: "+91-991010191",
            Join_Date: "Apr-24 2018, 12:00:00"
        },
        {
            CustomerID: "792b67f9-9026-43bc-9017-46cd2568b4e9",
            Name: "Prem Kumar",
            Email: "[email protected]",
            PhoneNumber: "+91-881010091",
            Join_Date: "Apr-24 2018, 15:00:00"
        }
    ]
}

Есть в любом случае в mongodb для получения пользовательских дат. Я использую соединение mongoose mongodb в своем проекте.

Я могу манипулировать данными, используя for loop with momentjs, но это занимает время.

Поэтому мне нужно решение для моего вопроса.

Заранее спасибо.

Комментарии приветствуются.

  • 0
    «Я могу манипулировать данными, используя цикл for с помощью минут, но это требует времени». на самом деле это ваш лучший вариант «если вы на самом деле что-то измените». Современные выпуски MongoDB имеют $dateToString , но форматы вывода ограничены. Вы действительно "не должны" изменить этот вывод, хотя. Это данные, отправляемые клиенту, а формат ISO - это то, что этот клиент действительно должен получать. Если «клиент» хочет отобразить в другом формате, то он должен сделать это сам, где он может специально отформатировать его «локаль». Даты не одинаковы в каждой стране.
  • 0
    так что нет никакого возможного решения от mongodb, кроме ограниченного $ dateToString
Показать ещё 2 комментария
Теги:
mongoose
momentjs

3 ответа

1

Вы можете использовать функцию отображения javascript, например

import Customers from "./Customers";
router.post('/List_All_Customers', (req, res) => {
    Customers.find().lean().exec().then((Data) => {
      Promise.resolve(arr.map(item=>{
       item.Join_Date = fnToConvertDateToYourFormate(item.Join_Date);
       return item;
      })).then(Data=>{
        res.json({Data: Data});
      });
    }).catch((err) => {
        console.log(err);
    });
})

ИЛИ Вы можете использовать Mongoose MapReduce http://mongoosejs.com/docs/api.html#mapreduce_mapReduce

var o = {};
o.map = function () { 
this.Join_Date = fnToConvertDateToYourFormate(this.Join_Date);
emit(this.CustomerId,this)
}
o.reduce = function (k, vals) {  }
mongoose.model('Customers').mapReduce(o, function (err, results) {
  console.log(results)
});
  • 0
    я знаю, как делать манипуляции с массивом JSON, используя карту, async и forEach и т. д.
  • 0
    я просто хочу знать, есть ли какое-то решение от mongodb
Показать ещё 1 комментарий
0

Вы можете использовать агрегированный запрос. Пример этого запроса приведен ниже:

 db.customers.aggregate([      
     {$project: 
         {yearMonthDayUTC: 
             {$dateToString: 
               {format: "%Y-%m-%d", 
                date: "$date" 
               } 
             },
         }
      }
    ])

Для этого запроса дата должна быть в ISO. Поэтому, вставляя элемент в db, вы можете использовать new Date() поскольку это возвращает текущую дату как объект Date. Оболочка mongo обертывает объект Date с помощью помощника ISODate.

Пример вставки данных в db приведен ниже:

 db.sales.insert({  "_id" : 4,   "item" : "mansi",   "price" : 10,   "quantity" : 2,   "date" : new Date(Date.now())  })
0

Вы можете попробовать агрегирование mongoDB $dateToString.

Customers.aggregate([
  {
   $project: {
       "other_field": 1, // and so on as many fields you need
       Join_Date: {
         { $dateToString: { format: "%Y-%m-%d", date: "$Join_Date" } }
       }
    }
  }
]).then((Data) => {
        res.json({Data: Data});
    }).catch((err) => {
        console.log(err);
    });

Узнайте больше об этом: https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/

  • 0
    Формат ограничен, и мне нужно найти метод, и я должен самостоятельно работать над другими полями
  • 0
    @RatanUdayKumar да, формат немного ограничен, и да, вам нужно определить другие поля. Другой подход заключается в использовании промежуточного программного обеспечения mongoose, но опять-таки он включает в себя циклическое повторение.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню