node.js write data to influxdb timestamp is wrong - node.js

I'm writing data to my influxdb with node.js,but the time always wrong like,
I'm using Datetime in 'luxon'.
const from = DateTime.fromObject({ year: 2021, month: 12, day: 1, hour: 8});
const to = from.plus({ day: 1 });
let anchor = from;
whiel(anchor < to) {
notification.time = anchor.valueOf();
await write(notification);
anchor = anchor.plus({ minute: 5 });
}
the point should start from 2021/12/1 08:00:00 to 2021/12/3 15:55:00.
every 5 mins have a point,but see the picture in my influxdb
it seems like every 11 mins and 50 secs have one point, I don't understand.

Related

How to store HourTime parameter with mongoose schema?

I want to store Documents with HourTime parameter.
The requirement is to be store HourTime of opening hour of supermarket and I need the option to query "Which supermarket is open now"?
what the best practice to do that and how to develop it?
I use nodejs, express and mongoose.
thanks
You can use hour and minute. First you need to create the fields, if you have multiple times depending on week day you can also use an array.
{
_id: ObjectId("600631c7c8eb4369cf6ad9c8"),
name: "Market X",
openHour: 10, // number between 0 and 23
openMinute: 30 // number between 0 and 59,
closeHour: 18, // number between 0 and 23,
closeMinute: 30, // number between 0 and 59
weekDay: 1 // number beetween 1 and 7
}
With a model like this you can do a find:
{
weekDay: 1, // number between 1 (Monday) and 7 (Sunday)
openHour: { $lte: 11 }, // number between 0 and 23
openMinute: { $lte: 32 }, // number between 0 and 59
closeHour: { $gte: 17 }, // number between 0 and 23
closeMinute: { $gte: 20 } // number between 0 and 59
}
The params for the query in find you can achieve using time with day.js, for example dayjs().format("HH") will retrieve the actual hour where your node is running.

Select all one day back but not older as one day

I try to use a Sequelize function to collect only table content that is older than today. But only for one day, not two days. As sample today
today: 2022/08/23
values only for: 2022/08/22 but not for 2022/08/21 and older.
For this is use:
checkDateBack: async function() {
return await dayins.findAll({
where: {
added_at: {
[Op.gte]: Sequelize.literal("DATE_SUB(CURDATE(), INTERVAL 1 DAY)"),
}
},
raw: true,
})
},
I have deleted all entries for 2022/08/22 in my temporary debug table but the result is 2022/08/21. In my idea of the function 2022/08/21 and older will get ignored.
So if I delete all entries for 2022/08/22 I expect an empty result.
Anything I did wrong with the function so it collects also 2 days old?
As I understood you need yesterday data, you need to get date range, use moment js for date
let date = new Date(); //suppose today is 2022/08/23
let endDate = moment(date).startOf("day").toString(); // starting of the day 12 am of(2022/08/23 )
let startDate = moment(date).subtract(1, "days").startOf("day").toString(); // starting of the day 12 am of(2022/08/22 )
// use [Op.between] insate of [Op.gte]
return await dayins.findAll({
where: {
added_at: {
[Op.between]: [startDate, endDate],
}
},
raw: true,
})
// it will return all data of 2022/08/22
// for sequelize createdAt if dont have any custome date fild
createdAt: {
[Op.between]: [startDate, endDate],
},

Changing date format in a Node js project

I am creating a Node js project which connects to an API and returns a date in the format of 2021-02-28T22:46:01.000-0500 I would like to convert this date to a format of mm/dd/yyyy format. Even better if its mm/dd/yyy hh:mm:ss
This is the current line of code.
this.createdDate = djItem.fields.created
What do I need to add to update the date format?
I am trying to create a function which can be used by two different lines of codes with dates.
this.createdDate = getDate(djItem.fields.created ? djItem.fields.created : 0);
getDate = function(date){
const dateAsNumber = date.parse(createdDate)
console.log(dateAsNumber)
const dateOptions = {
month: "numeric",
day: "numeric",
year: "2-digit",
hour: "numeric",
minute: "numeric",
second:"numeric",
}
const newDateString = new Date(dateAsNumber).toLocaleDateString("us-en", dateOptions);
console.log(newDateString)
}
Current error is createdDate is not defined
You can do this by first parsing the date time format (this will give you a timestamp as a bigint) and then by using the built in data function .toLocaleDateString() function with options that meet your needs.
const dateAsNumber = Date.parse("2021-02-28T22:46:01.000-0500")
// it is now a number
console.log(dateAsNumber)
const dateOptions ={
month: "numeric",
day: "numeric",
year: "2-digit",
hour: "numeric",
minute: "numeric",
second:"numeric",
}
const newDateString = new Date(dateAsNumber).toLocaleDateString("us-en", dateOptions);
console.log(newDateString)

How to get date difference in mongoDB ? Date should be come in difference of days?

I wants to filter the collection on the basis of subtract expiry date object with current date and which is less than equal to 10 days.
I am using below code but I am getting date difference in millisecond. I want in exact day difference.
db.metaobject.aggregate(
{ $unwind :'$certifications.expiry_date'},
{$project:{
_id:1,name:1,date-Difference: { $divide:[ {$subtract: [ "$certifications.expiry_date",new Date ]},86400000] }
}
},
{$match:{
dateDifference:{$lte:10}
}
}
)
If its to be used in node, you dont need to compute the difference :
Compute directly the date + 10 in node js then just to the $lte :
var date = new Date();
var date10 = new Date(date.getTime());
date10.setDate(date10.getDate() + 10);
db.metaobject.aggregate(
{ $unwind :'$certifications.expiry_date'},
{$match:{
dateDifference:{$lte: new Date(date10).toJSON()}
}
}
)

MongoDB/Mongoose querying at a specific date?

Is it possible to query for a specific date ?
I found in the mongo Cookbook that we can do it for a range Querying for a Date Range
Like that :
db.posts.find({"created_on": {"$gte": start, "$lt": end}})
But is it possible for a specific date ?
This doesn't work :
db.posts.find({"created_on": new Date(2012, 7, 14) })
That should work if the dates you saved in the DB are without time (just year, month, day).
Chances are that the dates you saved were new Date(), which includes the time components. To query those times you need to create a date range that includes all moments in a day.
db.posts.find({ //query today up to tonight
created_on: {
$gte: new Date(2012, 7, 14),
$lt: new Date(2012, 7, 15)
}
})
...5+ years later, I strongly suggest using date-fns instead
import endOfDayfrom 'date-fns/endOfDay'
import startOfDay from 'date-fns/startOfDay'
MyModel.find({
createdAt: {
$gte: startOfDay(new Date()),
$lte: endOfDay(new Date())
}
})
For those of us using Moment.js
const moment = require('moment')
const today = moment().startOf('day')
MyModel.find({
createdAt: {
$gte: today.toDate(),
$lte: moment(today).endOf('day').toDate()
}
})
Important: all moments are mutable!
tomorrow = today.add(1, 'days') does not work since it also mutates today. Calling moment(today) solves that problem by implicitly cloning today.
Yeah, Date object complects date and time, so comparing it with just date value does not work.
You can simply use the $where operator to express more complex condition with Javascript boolean expression :)
db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })
created_on is the datetime field and 2012-07-14 is the specified date.
Date should be exactly in YYYY-MM-DD format.
Note: Use $where sparingly, it has performance implications.
Have you tried:
db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})
The problem you're going to run into is that dates are stored as timestamps in Mongo. So, to match a date you're asking it to match a timestamp. In your case I think you're trying to match a day (ie. from 00:00 to 23:59 on a specific date). If your dates are stored without times then you should be okay. Otherwise, try specifying your date as a range of time on the same day (ie. start=00:00, end=23:59) if gte doesn't work.
similar question
You can use following approach for API method to get results from specific day:
# [HTTP GET]
getMeals: (req, res) ->
options = {}
# eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
if req.query.date?
date = new Date req.query.date
date.setHours 0, 0, 0, 0
endDate = new Date date
endDate.setHours 23, 59, 59, 59
options.date =
$lt: endDate
$gte: date
Meal.find options, (err, meals) ->
if err or not meals
handleError err, meals, res
else
res.json createJSON meals, null, 'meals'
i do it in this method and works fine
public async getDatabaseorderbyDate(req: Request, res: Response) {
const { dateQuery }: any = req.query
const date = new Date(dateQuery)
console.log(date)
const today = date.toLocaleDateString(`fr-CA`).split('/').join('-')
console.log(today)
const creationDate = {
"creationDate": {
'$gte': `${today}T00:00:00.000Z`,
'$lt': `${today}T23:59:59.999Z`
}
};
`
``
Problem I came into was filtering date in backend, when setting date to 0 hour, 0 minute, 0 second, 0 milisecond in node server it does in ISO time so current date 0 hour, 0 minute, 0 second, 0 milisecond of client may vary i.e. as a result which may gives a day after or before due to conversion of ISO time to local timezone
I fixed those by sending local time from client to server
// If client is from Asia/Kathmandu timezone it will zero time in that zone.
// Note ISODate time with zero time is not equal to above mention
const timeFromClient = new Date(new Date().setHours(0,0,0,0)).getTime()
And used this time to filter the documents by using this query
const getDateQuery = (filterBy, time) => {
const today = new Date(time);
const tomorrow = new Date(today.getDate() + 1);
switch(filterBy) {
case 'past':
return {
$exists: true,
$lt: today,
};
case 'present':
return {
$exists: true,
$gte: today,
$lt: tomorrow
};
case 'future':
return {
$exists: true,
$gte: tomorrow
};
default:
return {
$exists: true
};
};
};
const users = await UserModel.find({
expiryDate: getDateQuery('past', timeFromClient)
})
This can be done in another approach using aggregate if we have timezoneId like Asia/Kathmandu
const getDateQuery = (filterBy) => {
const today = new Date();
const tomorrow = new Date(today.getDate() + 1);
switch(filterBy) {
case 'past':
return {
$exists: true,
$lt: today,
};
case 'present':
return {
$exists: true,
$gte: today,
$lt: tomorrow
};
case 'future':
return {
$exists: true,
$gte: tomorrow
};
default:
return {
$exists: true
};
};
};
await UserModel.aggregate([
{
$addFields: {
expiryDateClientDate: {
$dateToParts: {
date: '$expiryDate',
timezone: 'Asia/Kathmandu'
}
}
},
},
{
$addFields: {
expiryDateClientDate: {
$dateFromParts: {
year: '$expiryDateClientDate.year',
month: '$expiryDateClientDate.month',
day: '$expiryDateClientDate.day'
}
}
},
},
{
$match: {
expiryDateClientDate: getDateQuery('past')
}
}
])
We had an issue relating to duplicated data in our database, with a date field having multiple values where we were meant to have 1. I thought I'd add the way we resolved the issue for reference.
We have a collection called "data" with a numeric "value" field and a date "date" field. We had a process which we thought was idempotent, but ended up adding 2 x values per day on second run:
{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}
We only need 1 of the 2 records, so had to resort the javascript to clean up the db. Our initial approach was going to be to iterate through the results and remove any field with a time of between 6am and 11am (all duplicates were in the morning), but during implementation, made a change. Here's the script used to fix it:
var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
var datum = data.next();
var rdate = datum.date;
// instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
}
else {
print("Removing " + datum._id);
db.data.remove({ "_id": datum._id});
}
}
else {
found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
}
}
and then ran it with mongo thedatabase fixer_script.js
Well a very simple solution to this is given below
const start = new Date(2020-04-01);
start.setHours(0, 0, 0, 0);
const end = new Date(2021-04-01);
end.setHours(23, 59, 59, 999);
queryFilter.created_at={
$gte:start,
$lte:end
}
YourModel.find(queryFilter)
So, the above code simply finds the records from the given start date to the given end date.
Seemed like none of the answers worked for me. Although someone mentioned a little hint, I managed to make it work with this code below.
let endDate = startingDate
endDate = endDate + 'T23:59:59';
Model.find({dateCreated: {$gte: startingDate, $lte: endDate}})
startingDate will be the specific date you want to query with.
I preferred this solution to avoid installing moment and just to pass the startingDate like "2021-04-01" in postman.

Resources