如何动态更新Mongoose模式中的数组名称

ufj5ltwl  于 2023-06-23  发布在  Go
关注(0)|答案(1)|浏览(99)

我使用 Mongoose ,并希望能够动态更新数组,包括所有其他领域。
在我下面的Schema中,我希望能够用正确的值修改“dynamic_title”。

import mongoose from "mongoose";

const bookSchema = new mongoose.Schema({
  dynamic_title: {
    thumbnail_url: String,
    details: {
      title: String,
      by_statement: String,
      publishers: [String],
      description: {
        type: String,
        value: String,
      },
      publish_date: String,
      series: [String],
      identifiers: {
        amazon: [String],
      },
      languages: [
        {
          key: String,
        },
      ],
      isbn_10: [String],
      isbn_13: [String],
    },
  },
});

export const Book = mongoose.model("book", bookSchema);

这是我的index.js

import axios from "axios";
import logSymbols from "log-symbols";
import mongoose from "mongoose";
import { ISBN } from "./models/isbn.js";
import { Book } from "./models/book.js";

const database = 'MONGO_URL';

mongoose.connect(database, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
});

async function process() {
  try {
    const isbnData = await ISBN.find().lean();

    for (const doc of isbnData) {
      const id = doc.isbn13;
      const url = `https://openlibrary.org/api/books?bibkeys=ISBN:${id}&jscmd=details&format=json`;
      const response = await axios.get(url);
      const data = response.data;

      await Book.insertMany(data);
      console.log(`${logSymbols.success} ${id} processed.`);
    }

    console.log(`${logSymbols.success} All documents processed.`);
  } catch (error) {
    console.error(logSymbols.error, error);
  }
}

process();

最后,这是我试图插入的数据类型。每个不同的数据片段都有一个“ISBN:”,其中包含所有其他元素,我希望能够更新这个元素。否则我就无法访问数据。
JSON data
当我尝试使用一个不包含Array的Schema时,它将返回空Schema。
Database/Result

v440hwme

v440hwme1#

不确定您是否知道这一点,但您需要传递一个以您的模式定义方式结构化的对象。例如,当你调用:

await Book.insertMany(data);

你的data对象需要是一个格式化对象数组,与你的schema中的key:value对对齐。对象应该如下所示:

dynamic_title: {
thumbnail_url: 'https://www.somehwere.com/pic.jpg',
details: {
  title: 'Picture of Cat',
  by_statement: 'foo',
  publishers: ['Giphy'],
  description: {
    type: 'JPEG',
    value: 'foobar',
  },
  publish_date: '1st Nov 1999',
  series: ['foo'],
  identifiers: {
    amazon: ['bar'],
  },
  languages: [
    {
      key: 'eng',
    },
  ],
  isbn_10: ['1234'],
  isbn_13: ['5678'],
 },
}

不能只传递await axios.get(url);调用返回的数据。这与数据库所需的数据结构不同。从安全的Angular 来看,您也不希望将数据从第三方直接传递到数据库中。验证要使用的每个值是否是您期望的正确数据格式,并在可能的情况下进行清理。
最后,我希望我理解了你的问题,但是你不能动态地设置dynamic_title,因为在你的模式中这看起来像一个key,而不是一个value

相关问题