MongoDB find between the dates - mongodb

I've got the next data in the MongoDB:
{
...
name: Alex,
createdAt: {"$date":"2021-03-09T20:01:57.488Z"},
...
}
And I try to implement the range date query like this:
MongoClient.connect(url, (err, db) => {
if (err) {
return reject(err);
}
const dbo = db.db('dbname');
dbo.collection('users').find({
createdAt: {
$gte: new Date(dateFrom).toISOString(),
$lt: new Date(dateTo).toISOString()
}
}).toArray(
(err, res) => {
if (err) { return reject(err); }
db.close();
return resolve(res);
});
});
And always have zero-result without errors..
How coud I do the right query?

Related

How to add attribute to the result of mongoose query before res.status(200).send(result);

I am trying to build a CRUD API that query a mongodb. I want to add another attribute (temperature) to the query result before sending it back to the client. Particularly, I would like to do something where the arrow pointed in the code below.
app.get('/items/:name', function (req, res) {
console.log("get items by name");
Item.find({ name: req.params.name }, function (err, result) {
if (err) {
res.status(400).send(err.message);
} else {
res.status(200).send(result); // <<<<====== Here
}
});
});
How can I achieve this function? Thank you.
i think this below way to help you:
app.get('/items/:name', function (req, res) {
console.log("get items by name");
Item.find({ name: req.params.name }, function (err, result) {
result = {
temperature: yourTemperatureValue,
...result
} // <<<<====== Here
if (err) {
res.status(400).send(err.message);
} else {
res.status(200).send(result);
}
});
});

findByIdAndUpdate do not update document

I am trying to update a field to the document with findByIdAndUpdate. The field I am trying to update is defined in the Bar Model. And I can also assure that req.body.bookId has a valid id.
Here's how my request looks,
app.patch("/foo", async (req, res) => {
try {
await validateId(req.body.bookId);
let doc = await Bar.findByIdAndUpdate(
req.body.bookId,
{ DateT: Date.now() },
{ new: true }
);
res.send(doc);
} catch (err) {
console.log(err);
}
});
Bar schema,
const mongoose = require("mongoose");
const barSchema = mongoose.Schema({
bookId: {
type: String,
unique: true,
},
DateT: {
type: Date,
default: null,
},
});
module.exports = mongoose.model("Bar", barSchema);
use updateOne, when you use async don't use .then() use try/catch
test it:
app.patch("/foo", async (req, res) => {
try {
let doc = await Bar.updateOne(
{ bookId : req.body.bookId },
{ DateT: Date.now() },
{ new: true }
);
res.send(doc);
} catch (error) {
console.log(error);
}
});
app.patch("/foo", async (req, res) => {
await Bar.findByIdAndUpdate(
req.body.bookId,
{ DateT: Date.now()},
(err, docs) => {
if (err) {
console.log(err);
} else {
res.send(docs);
}
}
);
});

Mongoose find between dates, order by ID

So I am trying to find all documents in a database between 'X' and 'X' dates and then order those by userID. This is what I have so far:
await Expense.find(
{'date' :{'$gte': new Date(startDate), '$lte': new Date(endDate)}}),{sort: {_id: 1}}.exec(function(err, data){
if(err){
console.log('Error Fetching Model');
console.log(err);
}
console.log(JSON.stringify(data, null));
expenseArray = data;
console.log(expenseArray);
But it keeps giving me "TypeError: {(intermediate value)}.exec is not a function"
For added clarification I am trying to write this in mongoose:
"SELECT employeeName, SUM(amount)
FROM reimbursements
WHERE d8 BETWEEN '$startDate' AND '$endDate'
GROUP BY employeeName
ORDER BY employeeName;";
What am I doing wrong? Thank you in advance :D
Your query has few syntax issues, Please try this :
Update :
Below old code will work, but it would be better if you try this way :
try {
let data = await Expense.find(
{ 'date': { '$gte': new Date(startDate), '$lte': new Date(endDate) } }).sort({ _id: 1 })
/** .find() will not return null, it will either return [] or [with matched docs] */
if (data.length) { // checks data != []
console.log(data)
} else { // data == []
console.log('Empty - no docs found')
}
} catch (error) {
console.log('Error Fetching Model');
console.log(error);
}
Old :
await Expense.find(
{ 'date': { '$gte': new Date(startDate), '$lte': new Date(endDate) } }).sort({ _id: 1 }).exec(function (err, data) {
/** sort is not an option for .find() not like aggregate, it has to be on cursor which is result of .find() & .exec() should be at end which is either .find() or .sort() */
if (err) {
console.log('Error Fetching Model');
console.log(err);
}
console.log(JSON.stringify(data, null));
expenseArray = data;
console.log(expenseArray)
})
Sample : mongooseModel.find().sort().exec()
Ref : cursor.sort

using $set on db.collection.save

I'am trying to add to date fields and some user info fields to a document, when inserting it into mongo (using db.collection.save).
Here is my code:
collection.save(
{document},
{
$set: {
"document.createdBy": "2",
"document.updatedBy": "2",
"document.created": new Date(),
"document.updated": new Date()
}
},
(err, result) => {
if (err){
res.status(500).json({ status: 'something is wrong' })
//return next(err);
}else{
res.status(200).json({ status: 'ok' })
//return next();
}
});
Mongo only inserts the document and none if the fields in the $set. Any ideas to what I'am doing wrong?
There is no argument for the $set operator in .save() query in mongodb
So instead try to append the object before the query
document.createdBy = "2",
document.updatedBy = "2",
document.created = new Date(),
document.updated = new Date()
collection.save(document, (err, result) => {
if (err){
res.status(500).json({ status: 'something is wrong' })
//return next(err);
} else {
res.status(200).json({ status: 'ok' })
//return next();
}
})

Query mongoDB with mongoose model

Im using the find() method to get all data from a mongoDB like this
exports.getPersona = function (req, res){
Persona.find( function(err, persona) {
if (err)
res.send(err)
res.json(persona); // return all personas in json
}
);
}
Im trying to do a query like this:
exports.getPersona = function (req, res){
Persona.find(
{
faceDetection: {
name: "Borja"
}, function(err, persona) {
if (err)
res.send(err)
res.json(persona);
}
);
}
But i dont find nothing. My mongoose model is:
var faceDetectionSchema = mongoose.Schema({
faceDetection: {
name: String,
surname: String,
}
});
What could be the problem? Thanks a lot.
Edit: the document its a JSON like:
{
"faceDetection": {
"name": "Borja",
"surname": "Good"
}
Looks like your parentheses and braces are out of order. Try this below.
exports.getPersona = function(req, res) {
Persona.find({
'faceDetection.name': "Borja"
}, function(err, persona) {
if (err)
res.send(err)
res.json(persona);
})
}