Создание 5 элементов и обновление массива в mongodb (продолжение обсуждения моего предыдущего вопроса)

Я изменил что-то новое в базе данных. Так как у меня есть 5 элементов mongodb.. вот код Это для моего main-model.js

const mongoose = require('mongoose')

const Schema = mongoose.Schema

const mainSchema = new Schema({
    likes:{
        type:Number,
        max:100000
    },
    people:[{
        key:{type:String},
        name:{type:String}
    }]
},{
    timestamps:true
})

const MAIN = mongoose.model('liker-model',mainSchema)

MAIN.insertMany([
    {"_id":mongoose.Types.ObjectId(1),likes:0,people:[]},
    {"_id":mongoose.Types.ObjectId(2),likes:0,people:[]},
    {"_id":mongoose.Types.ObjectId(3),likes:0,people:[]},
    {"_id":mongoose.Types.ObjectId(4),likes:0,people:[]},
    {"_id":mongoose.Types.ObjectId(5),likes:0,people:[]},
])

module.exports = MAIN

Сейчас я передам liker.js который будет кодом

const router = require('express').Router()
let Main = require('../models/main-model')

router.route('/').get((req,res) => {
    Main.find()
        .then(likes => res.json(likes))
        .catch(err => console.info(err))
})

router.route('/item/:id').post((req,res) => {

    const id = req.params.id
    
    console.info(id)

    if (!id) return res.status(400).json({ message: "missing id" });

    const { likes, people } = req.body;

    Main
        .updateOne(
        { _id: id },
        {
            $addToSet: { people: { $each: people } },
            $set: {
                likes,
            },
        },
        )
        .then((likes) => res.json({ message: "New User Added" }))
        .catch((err) => res.status(400).json("Error :" + err));

})  

module.exports = router

На основании того, что вы обсуждаете, это СВЯЗЬ

но я сделал что-то новое.. В первой части Main.insertMany() в main-model.js я создаю 5 элементов, но здесь что-то идет не так.. Если я попытаюсь перезапустить свой server.js, он создаст еще 5 элементов, поэтому он покажет что-то вроде этого в моя база данных. Создание 5 элементов и обновление массива в mongodb (продолжение обсуждения моего предыдущего вопроса) Я хочу сказать, что, поскольку у меня есть 5 фотоэлементов в моем интерфейсе, это означает, что мне нужно 5 элементов в моей базе данных, которые вы увидите в моем main-model.js. Теперь, когда у меня есть представление о том, как я буду помещать свои элементы в свой массив для каждого элемента, который я хочу нажать. В коде, который вы упомянули в моем посте

router.route('/item/1').post((req,res) => {

    const { likes, people } = req.body

    Main.updateOne({likes}, {$addToSet: { people: {$each: people} } } )
    .then(likes => res.json('New User Added'))
    .catch(err => res.status(400).json('Error :' + err))

})  

но так как мне нужен идентификатор, как вы упоминали ранее...

router.route("/item/:id").post((req, res) => {
  const id = req.params.id;
  if (!id) return res.status(400).json({ message: "missing id" });
  const { likes, people } = req.body;

  const model = mongoose.model("collection_name", mainSchema);

  model
    .updateOne(
      { _id: id },
      {
        $addToSet: { people: { $each: people } },
        $set: {
          likes,
        },
      },
    )
    .then((likes) => res.json({ message: "New User Added" }))
    .catch((err) => res.status(400).json("Error :" + err));
});

но в моем insertMany() он создает свой собственный идентификатор, поэтому я должен передать его в своем интерфейсе

      axios.get('http://localhost:7171/likes')
        .then(listid => setlistid(list.data))
        .catch(err => console.info(err))

что-то вроде этого и передать его обратно в мой бэкэнд/базу данных

axios.post('http://localhost:7171/likes/item/listid[0]._id',{ people:{name:name,key:key }})
          axios.post('http://localhost:7171/likes/item/listid[1]._id',{ people:{name:name,key:key } })
          axios.post('http://localhost:7171/likes/item/listid[2]._id',{ people:{name:name,key:key } })
          axios.post('http://localhost:7171/likes/item/listid[3]._id',{ people:{name:name,key:key } })
          axios.post('http://localhost:7171/likes/item/listid[4]._id',{ people:{name:name,key:key } })

Я уже понял.. но вы не представляете, как мне не воссоздать еще 5 элементов в моем main-model.js всякий раз, когда я пытался перезапустить свой server.js???

ох, это моя самая длинная дискуссия, лол..

Использование JavaScript и MongoDB
Использование JavaScript и MongoDB
Сегодня я собираюсь вкратце рассказать о прототипах в JavaScript, а также представить и объяснить вам работу с базой данных MongoDB.
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во-первых, mongodb хранит идентификатор не как целое число (например, 1,2,3,4,5), а сохраняет как ObjectId.

ссылка: https://mongoosejs.com/docs/guide.html#_id


Во-вторых, если вы хотите вставить несколько значений по умолчанию для коллекции liker-model. То, как вы используете, неверно, потому что код id с mongoose.Types.ObjectId(1) будет генерировать новый один раз каждый раз, когда вы запускаете внутренний сервер nodejs. Вы должны сделать что-то вроде


const defaultIdLikerModel = [
  "00000001a24dfc9b806e607f",
  "00000001a24dfc9b806e607d",
  "6235f2fea24dfc9b806e6080",
  "6235f306a24dfc9b806e6081",
  "6235f30aa24dfc9b806e6082",
]; // generate default id to query insert only not exist

const queries = []; // push multiple query insert if not exist

defaultIdLikerModel.forEach((likerId) => {
  queries.push(
    MAIN.findOneAndUpdate(
      { _id: likerId },
      {
        $setOnInsert: {
          likes: 0,
          people: [],
        },
      },
      {
        upsert: true,
      },
    ),
  );
});

await Promise.all(queries); // execute all queries

В-третьих, в вашем маршруте /item/:id. Если вам требуется main-model.js, так как вы были объявлены моделью с помощью const MAIN = mongoose.model('liker-model',mainSchema), вам не нужно повторно объявлять с помощью const model = mongoose.model("collection_name", mainSchema);. Просто используйте что-то вроде этого

const model = require('./main-model')

model.updateOne(
        { _id: id },
        {
            $addToSet: { people: { $each: people } },
            $set: {
                likes,
            },
        },
        )
        .then((likes) => res.json({ message: "New User Added" }))
        .catch((err) => res.status(400).json("Error :" + err));

Сэр, я думаю, у вас есть ошибка в части запросов? Это дает мне ошибку, как это. await Promise.all(queries);^^^^^SyntaxError: await is only valid in async functions and the top level bodies of modules

MYTH 20.03.2022 03:07

На самом деле, неважно, сэр.. давайте прекратим это, хахаха... Я исследую это для себя. Кажется, я просто пропустил часть урока, хахах..

MYTH 20.03.2022 03:34

ах :D Ваш main-model.js не асинхронный. Итак, вы меняете await Promise.all(queries) => Promise.all(queries).then().catch(error => console.info(error) Ключ для этого developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

tuphamdev96 20.03.2022 04:20

Другие вопросы по теме