无法使猫鼬正确保存数组

时间:2019-05-28 09:51:31

标签: node.js mongoose

我正在尝试使用NodeJS从零开始构建电子商务,并按照本教程进行表达和猫鼬:https://www.youtube.com/playlist?list=PL55RiY5tL51rajp7Xr_zk-fCFtzdlGKUp,但是当我save()时,程序最终编写了所有内容的副本并保留了原来也是。

我尝试使用updateMany()insertMany(),但没有帮助。

这是位于product.js中的架构

const schema = new Schema({
  imagePath: {type: String, required: true},
  title: {type: String, required: true},
  description: {type: String, required: true},
  price: {type: Number, required: true}
});

module.exports = mongoose.model('Product', schema);

这是在product-seeder.js中

const Product = require('../models/product');

const products = [
  new Product({
    imagePath: 'https://images-na.ssl-images-amazon.com/images/I/41mPFjDCaXL.jpg',
    title: 'Gfuel 1',
    description: 'Lorem Ipsum',
    price: 20
  }), ...x4
]

let done = 0;
for (let i = 0; i < products.length; i++) {
  products[i].updateOne((err, result) => {
    done++;
    if (done === products.length) {
      exit();
    }
  });
}

const exit = () => {
  mongoose.disconnect();
}

如果数据库中没有任何内容,这会很好,但是当我多次运行此代码时,当它应该只保留每个对象之一时,它将多次写入同一件事,并且如果我更改某些信息,它将自动更新它。

2 个答案:

答案 0 :(得分:0)

如果您不想在每次运行时都重复创建文档,则需要在文档中以“唯一”的方式进行一些键入。 尝试将模式中的“ imagePath”设置为唯一,如下所示。

const schema = new Schema({ 
imagePath: {type: String, required: true, unique: true},
title: {type: String, required: true},
description: {type: String, required: true},
price: {type: Number, required: true}});

答案 1 :(得分:0)

您应该调用save而不是updateOne,因为您没有传递有效的ObjectId,因此无法进行任何更新,因此没有引用应更新的内容。

Read the docs明白我的意思。

让我们假设您的Product-seeder.js将产品存储到数据库中。如果要修改它们,则必须从数据库中获取单个产品或一组产品,然后对其进行修改并再次保存。

const Product = require('../models/product');

Product.find().exec((err, docs) => {
  if (err) return false; // log the error, send it to front-end, etc...
  docs.forEach((doc) => {
    doc.title = 'New Title here'
    doc.save()
  })
})

这应该更新数据库中的每个产品。现在,您所有的产品都应具有标题“此处为新标题”。

要获取单个文档,请将findOne_id属性或title或其他任何属性一起使用。