Cara memposting data MongoDB ke array bersarang menggunakan NODE.js dan Express
Saya telah mencoba untuk mengirim data dari MongoDB ke pengguna yang masuk. Jadi, setiap kali pengguna memicu permintaan untuk mengirim data, itu harus dikirim dan disarangkan di bawah pengguna itu.
router.post ()
router.post('/savetasks', async (req, res) => {
console.log(req.body);
const { startTime, endTime, elapsedTime } = req.body;
const newTime = new Time({startTime, endTime, elapsedTime});
await newTime.save();
const token = jwt.sign({ _id: newTime._id}, 'secretkey');
res.status(200).json({token});
});
Dengan menggunakan metode ini saya berhasil menyimpan data di MongoDB tetapi saya tidak mengerti bagaimana membuatnya bersarang di bawah pengguna tertentu.
Seharusnya seperti ini:
const userSchema = new Schema({
firstname: String,
lastname: String,
email: String,
password: String,
timings: [{
startTime: String,
endTime: String,
elapsedTime: String
}]
});
Saya telah mencoba berbagai cara tetapi semuanya memberi saya kesalahan. Salah satu cara yang paling memberi saya kepercayaan sebenarnya adalah dengan memberikan jalur '/ posttasks /: _ id', dan menetapkan add.function()tetapi karena saya baru di Mongo, Express, dan Node.js, saya tidak dapat melakukannya
Kode sudut
import { Component, OnInit } from '@angular/core';
import { timer, from } from 'rxjs';
import { AuthService} from '../../services/auth.service';
import { TasksService } from '../../services/tasks.service';
import * as moment from 'moment';
import {formatDate} from '@angular/common';
import { Router } from '@angular/router';
@Component({
selector: 'app-private-tasks',
templateUrl: './private-tasks.component.html',
styleUrls: ['./private-tasks.component.css']
})
export class PrivateTasksComponent implements OnInit {
date:Date;
times: number = 0;
display ;
interval;
time = [] as any;
tasks = [] as any;
user = [] as any;
startTime: any = formatDate(new Date(), 'yyyy/MM/dd HH:mm:ss', 'en');
endTime: any= formatDate(new Date(), 'yyyy/MM/dd HH:mm:ss', 'en');
elapsedTime: any = formatDate(new Date(), 'HH:mm:ss', 'en');
constructor(
private authService: AuthService,
private tasksService: TasksService,
private router: Router
) {
setInterval(() => {
this.date = new Date()
}, 1000)
}
ngOnInit(): void {
this.tasksService.getTasks1()
.subscribe(
res => {
this.tasks = res;
console.log(this.tasks);
},
err => console.log(err)
);
}
startTimer() {
console.log("=====>");
this.startTime = new Date();
this.interval = setInterval(() => {
if (this.times === 0) {
console.log(this.startTime);
this.times++;
} else {
this.times++;
}
this.display=this.transform( this.times)
}, 1000);
}
transform(value: number) {
var minutes: number = Math.floor(value / 60);
var hours : number = Math.floor(minutes / 60);
return hours + ':' + minutes;
}
pauseTimer() {
clearInterval(this.interval);
this.endTime = new Date();
//this.userID = new this.userID;
console.log(this.endTime);
const requestBody = {
startTime: this.startTime,
endTime: this.endTime,
elapsedTime: this.endTime - this.startTime
};
this.authService.postTasks({ requestBody })
.subscribe(
res => {
this.time = res;
console.log(this.time);
},
err => console.log(err)
);
}
}
Jawaban
Anda dapat menggunakan Model.prototype.updatein luwak untuk memperbarui sub-dokumen timings.
Namun ada dua skenario -
- Jika Anda ingin memasukkan entri tanpa perlu memeriksa duplikat, gunakan $pushoperator
var filter = {
_id: mongoose.Types.ObjectId('<USER_ID>')
};
var update = {
$push: {
timings: {
startTime: "",
endTime: "",
elapsedTime: ""
}
}
};
db.collection.update(filter, update);
- Jika Anda hanya ingin mendorong entri yang berbeda, gunakan $addToSetoperator
var filter = {
_id: mongoose.Types.ObjectId('<USER_ID>')
};
var update = {
$addToSet: {
timings: {
startTime: "",
endTime: "",
elapsedTime: ""
}
}
};
db.collection.update(filter, update);
Catatan: Membutuhkan mongoosedulu
const mongoose = require('mongoose');
Perbaiki kode Anda di bawah ini, Anda juga tidak bisa mendapatkan Id sub-dokumen yang tepat, tetapi Anda bisa mendapatkan dokumen root yang diperbarui -
const updatedUser = await User.findOneAndUpdate({
_id: mongoose.Types.ObjectId(req.body._id)
},
{
$addToSet: {
timings: {
startTime,
endTime,
elapsedTime
}
}
}, {
new: true
}).exec();