Добавление массива объектов в проблему mongodb - PullRequest
0 голосов
/ 24 января 2020

У меня проблемы с добавлением массива объектов в mongodb. Проблема связана с тем, что когда я получаю сообщения ngOnInit () и есть запись для _id, подобная этой, прежде чем я начну добавлять что-либо в пригласить группу

enter image description here

Если я добавлю this.inviteGroup = [], чтобы избавиться от первой записи _id, я смогу успешно добавить в базу данных мое приглашение, как на этом изображении. Есть ли способ не иметь этот _id, который связан с моей схемой mon goose? но, естественно, this.inviteGroup = [] делает так, чтобы я мог иметь только одну запись за раз, так как это стирает все при загрузке страницы. Как я могу сделать эту запись _id больше не там, чтобы, когда я делаю .pu sh (), она не вызывала перезагрузку страницы, потому что она сбрасывает .pu sh (). Я хочу иметь несколько записей в БД для каждого приглашения. Это проблема моей модели goose? Я ценю любую помощь!

enter image description here

пн goose определение схемы

 inviteGroup: {
    bidderId: { type: String, lowercase: true, trim: true },
    username: { type: String, lowercase: true, trim: true }
  }

приложение. js

app.patch("/api/listings/:id", (req, res) => {
  console.log("INVITE GRdddOUP IS");
  console.log(req.body);
  console.log(req.body[0].biddingUserId);
  let invites;
  if (req.body[0].biddingUserId) {
    invites = req.body;
    console.log("INVITE IS");
  }
  console.log(invites);
  if (invites) {
    console.log("INVITE GROUP IS");
    console.log(req.params.id);
    Post.findByIdAndUpdate(
      { _id: req.params.id },
      {
        inviteGroup: invites
      },
      function(err, docs) {
        if (err) {
          console.log(err);
          res.json(err);
        } else {
          return true;
          console.log(docs);
        }
      }
    );

component.ts

import {
  Component,
  OnInit,
  ViewChild,
  OnDestroy,
  AfterViewInit
} from "@angular/core";
import { Router } from "@angular/router";
import {
  MatTableDataSource,
  MatPaginator,
  MatSort,
  MatDialog
} from "@angular/material";
import { NgForm, FormControl } from "@angular/forms";
import { SubmitListingService } from "../submit-listing/submit-auction.service";
import { BidderInvite } from "./bidder-invite.model";
import { Observable, Subject } from "rxjs";
import { startWith, map, takeUntil } from "rxjs/operators";
import { Page } from "ngx-pagination/dist/pagination-controls.directive";
import { BidderInviteRetrieved } from "./bidder-invite-retrieved";
@Component({
  selector: "app-private-auction-invite",
  templateUrl: "./private-auction-invite.component.html",
  styleUrls: ["./private-auction-invite.component.css"]
})
export class PrivateAuctionInviteComponent
  implements OnInit, AfterViewInit, OnDestroy {
  allMyPeopleAreInvited: boolean;
  auctionId: string;
  dataSource: MatTableDataSource<any> = new MatTableDataSource();
  timeout: any = null;
  posts: BidderInviteRetrieved[];
  artistId: string;
  bidderId: string;
  inviteGroup: BidderInvite[] = [];
  test: any[] = [];
  value: string;
  usernameFound: string;
  userSearched: string;
  invites: BidderInvite[] = [];
  destroy = new Subject();
  inviteName: string;
  filteredOptions: Observable<string[]>;
  myControl = new FormControl();
  selectedValue: string;

  url: string;
  displayedColumnsInvites: string[] = ["User", "revokeInvite"];
  options: string[] = [];

  @ViewChild(MatSort, { static: false }) set sort(sort: MatSort) {
    this.dataSource.sort = sort;
  }

  @ViewChild(MatPaginator, { static: false }) set paginator(
    paginator: MatPaginator
  ) {
    this.dataSource.paginator = paginator;
  }

  constructor(
    private router: Router,
    private submitListingService: SubmitListingService
  ) {}

  ngOnInit() {
    this.inviteGroup = [];
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
    this.allMyPeopleAreInvited = false;
    this.url = this.router.url;
    const value = this.router.url.split("/");

    this.auctionId = value[2];
    this.artistId = value[3];


    this.submitListingService
      .getPrivateAuctionInviteList(this.auctionId)
      .pipe(takeUntil(this.destroy))
      .subscribe(res => {
        this.inviteGroup = res.posts;
        console.log("res");
        console.log(res);
        console.log(this.inviteGroup);

        if (this.inviteGroup["_id"].length > 2) {
          this.inviteGroup = [];
          console.log(this.inviteGroup);
        }
      });

    this.filteredOptions = this.myControl.valueChanges.pipe(
      startWith(""),
      map(value => this._filter(value))
    );
  }
  ngAfterViewInit() {
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;

    this.dataSource = new MatTableDataSource(this.inviteGroup);

    this.dataSource.data = this.inviteGroup;
  }

  sendInvite(form: NgForm) {
    if (form.invalid) {
      return;
    }

    let counter: number;
    counter = 0;
    console.log("USER " + this.value);
    console.log("POST LEGNTH: " + this.posts.length);
    for (let i = 0; i < this.posts.length; i++) {
      counter = counter++;
      console.log("post");
      console.log(form.value.username);

      let user = this.posts[i].username.trim().toLowerCase();
      let enteredUser = form.value.username.trim().toLowerCase();
      console.log("COUNTER LOOP NUMBER: " + counter);


      if (enteredUser === user) {
        this.bidderId = this.posts[i].id;
        console.log(this.inviteGroup);

        let invites = this.inviteGroup;
        console.log("INVITE LENGTH =  " + this.inviteGroup.length);
        console.log(invites.indexOf);
        this.inviteGroup.push({
          biddingUserId: this.bidderId,
          username: this.posts[i].username
        });

        console.log(this.inviteGroup);
        console.log("invite group");
        console.log(this.inviteGroup);
        //this.posts = [];

        this.dataSource.data = this.inviteGroup;
        console.log("invite group");
      }
    }

    console.log("BIDDER ID " + this.bidderId);
    if (this.bidderId === null || this.bidderId === undefined) {
      console.log("SOMETHING WENT WRONG");
    }
    console.log("made it to next section");

    let invites = this.inviteGroup;
    console.log("invites[0].username");


    console.log("filtering....");

    invites = invites.filter((obj, pos, arr) => {
      return (
        arr.map(mapObj => mapObj["bidderId"]).indexOf(obj["bidderId"]) === pos
      );
    });

    console.log("invites");
    console.log(invites);
    this.submitListingService
      .sendPrivateAuctionInvite(this.auctionId, invites)
      .pipe(takeUntil(this.destroy))
      .subscribe(res => {
        console.log("res");
        console.log(res);
      });
  }

  private onKeySearch(event: any) {
    console.log("EVENT IS ");
    console.log(event);

    clearTimeout(this.timeout);
    var $this = this;
    this.timeout = setTimeout(function() {
      if (event.keyCode !== 13) {
        $this.executeListing(event.target.value);
      }
    }, 1000);
  }

  private executeListing(bidderName: string) {
    console.log("BIDDERNAME");
    console.log(bidderName);
    if (bidderName === "[Object object]") {
      return;
    }
    if (bidderName.length < 4) {
      return;
    }
    if (bidderName.length > 3) {
      this.submitListingService
        .getUserIdAutoComplete(bidderName)
        .pipe(takeUntil(this.destroy))
        .subscribe(res => {
          console.log("res");
          console.log(res);
          this.posts = res.posts;
          console.log(this.posts);

          //   this.artists = res.posts;
        });
    }
  }
  private _filter(value: string): string[] {
    const filterValue = value.toLowerCase();

    return this.options.filter(
      option => option.toLowerCase().indexOf(filterValue) === 0
    );
    console.log("OPTION IS " + filterValue);
  }
  storeUserPrivaeAuctionInvite(user: Page) {
    console.log("USER VALUE I S" + user);
  }

  ngOnDestroy() {
    this.destroy.next();
    this.destroy.complete();
  }
}

angular сервис

 sendPrivateAuctionInvite(id: string, inviteGroup1: BidderInvite[]) {

   // console.log(inviteGroup1);
    return this.http.patch(
      `http://localhost:3000/api/listings/${id}/`,
      inviteGroup1
    );
  }

Модель BidderInvite

export interface BidderInvite {
  biddingUserId: string;
  username: string;
}

Ответы [ 3 ]

1 голос
/ 28 января 2020

Ваше определение схемы должно быть:

 inviteGroup: {
    type: [inviteSchema]
    default: undefined //if you want to unset [] 
 }

 invite: {
    bidderId: { type: String, lowercase: true, trim: true },
    username: { type: String, lowercase: true, trim: true }
  }

(см. https://mongoosejs.com/docs/schematypes.html#arrays)

Попробуйте кэшировать, чтобы предотвратить перезагрузку. (См. https://github.com/isaacs/node-lru-cache) и Как запретить MongoDB перезагружать данные каждый раз, когда я обновляю sh страницу?

Попробуйте проекцию, чтобы исключить _id в вывод запроса с _id: 0. См. https://docs.mongodb.com/v3.2/tutorial/project-fields-from-query-results/#return поле "все, но исключено"

0 голосов
/ 28 января 2020

Если я правильно понял ваш вопрос, проблема связана с отсутствием оператора при методе обновления.

Когда вы используете что-то вроде:

Post.findByIdAndUpdate(
  { _id: req.params.id },
  {
    inviteGroup: invites // <-- Update statement
  },
  function(err, docs) {
    //...
  }
);

Это заменит полное значение поля inviteGroup.

Чтобы добавить элемент в существующий массив в базе данных, вам нужно будет использовать $push или $addToSet* Оператор 1014 * вместе с оператором $each.

Операторы $push и $addToSet, только добавить / добавить один элемент за раз, поэтому использование $each необходимо для взаимодействия с каждым элементом, присутствующим в массиве invites. В следующих примерах я включу это, потому что я верю, что вам нужно. Но, пожалуйста, не торопитесь, чтобы прочитать связанную документацию каждого оператора, чтобы вы могли найти больше примеров.

Оператор $push добавляет указанное значение в массив, не делая дополнительной проверки если добавленное значение уже существует в поле или нет. Как:

//document on mongodb, before the update
// { _id : "1", inviteGroup : [] }


//Invites from the request
// invites = [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ];

//update method
Post.findByIdAndUpdate(
  { _id: req.params.id }, //req.params.id = "1"
  { $push : { inviteGroup: { $each : invites } } },
  function(err, docs) {
    //...
  }
);

//document on mongodb, after the update
/*
{
  _id : "1",
  inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/

При повторном вызове метода обновления с теми же значениями:

Post.findByIdAndUpdate(
  { _id: req.params.id }, //req.params.id = "1"
  { $push : { inviteGroup: { $each : invites } } },
  function(err, docs) { }
);

// the end document will be like:
/*
{
  _id : "1",
  inviteGroup : [
    { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"},
    { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"}
  ]
}
*/

Таким же образом оператор $addToSet добавляет оператор значение в массив, если только это значение не присутствует, в этом случае $addToSet ничего не делает с этим массивом. Например:

//document on mongodb, before the update
// { _id : "1", inviteGroup : [] }


//Invites from the request
// invites = [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ];


//update method
Post.findByIdAndUpdate(
  { _id: req.params.id }, //req.params.id = "1"
  { $addToSet : { inviteGroup: { $each : invites } } },
  function(err, docs) {
    //...
  }
);

//document on mongodb, after the update
/*
{
  _id : "1",
  inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/

Если вы снова вызовете метод обновления с теми же значениями:

Post.findByIdAndUpdate(
  { _id: req.params.id }, //req.params.id = "1"
  { $addToSet : { inviteGroup: { $each : invites } } },
  function(err, docs) { }
);

//the end document will be the same because the same value was already on the list:
/*
{
  _id : "1",
  inviteGroup : [ { bidderId:"5e2350c7f88cfb331c4f67de", username:"artist1"} ]
}
*/

Что ж, я надеюсь, это было то, что вы искали. =]

0 голосов
/ 24 января 2020

Попробуйте это. Надеюсь, это поможет вам.

    Post.findByIdAndUpdate(
          { _id: req.params.id },
          {
            inviteGroup: invites
          },
          {select: {_id: 0}}, // sets the document fields to return
          function(err, docs) {
            if (err) {
              console.log(err);
              res.json(err);
            } else {
              return true;
              console.log(docs);
            }
          }
        );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...