So senden Sie MongoDB-Daten mit NODE.js und Express an das verschachtelte Array

Aug 23 2020

Ich habe versucht, Daten aus MongoDB an den angemeldeten Benutzer zu senden. Wenn also ein Benutzer eine Anforderung zum Posten von Daten auslöst, sollten diese unter diesem Benutzer gesendet und verschachtelt werden.

router.post () Methode

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}); 

});

Mit dieser Methode kann ich Daten erfolgreich in MongoDB speichern, aber ich verstehe nicht, wie ich sie unter dem bestimmten Benutzer verschachteln kann.

Es sollte so sein:

const userSchema = new Schema({
firstname: String,
lastname: String,
email: String,
password: String,
timings: [{
    startTime: String,
    endTime: String,
    elapsedTime: String
}]
});

Ich habe verschiedene Wege ausprobiert, aber alle haben mir Fehler gemacht. Der eine Weg, der mir am meisten Vertrauen gibt, besteht darin, den Pfad '/ posttasks /: _ id' anzugeben und zuzuweisen, add.function()aber da ich neu in Mongo, Express und Node.js bin, konnte ich das nicht erreichen

Winkelcode

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)
    );
}
}

Antworten

KunalMukherjee Aug 23 2020 at 14:24

Mit dem Model.prototype.updateMungo können Sie das Unterdokument aktualisieren timings.

Es gibt jedoch zwei Szenarien -

  1. Wenn Sie Einträge verschieben möchten, ohne Duplikate überprüfen zu müssen, verwenden Sie den $pushOperator
    var filter = {
        _id: mongoose.Types.ObjectId('<USER_ID>')
    };
    
    var update = {
        $push: {
            timings: {
                startTime: "",
                endTime: "",
                elapsedTime: ""
            }
        }
    };
    
    db.collection.update(filter, update);
  1. Wenn Sie nur bestimmte Einträge verschieben möchten, verwenden Sie den $addToSetOperator
    var filter = {
        _id: mongoose.Types.ObjectId('<USER_ID>')
    };
    
    var update = {
        $addToSet: {
            timings: {
                startTime: "",
                endTime: "",
                elapsedTime: ""
            }
        }
    };
    
    db.collection.update(filter, update);

Hinweis: mongooseZuerst anfordern

const mongoose = require('mongoose');

Korrigieren Sie Ihren Code wie folgt: Außerdem können Sie die genaue ID des Unterdokuments nicht abrufen, aber Sie können das aktualisierte Stammdokument abrufen.

const updatedUser = await User.findOneAndUpdate({
        _id: mongoose.Types.ObjectId(req.body._id)
    },
    {
        $addToSet: {
            timings: {
                startTime, 
                endTime, 
                elapsedTime
            }
        }
    }, {
        new: true
    }).exec();