猫鼬模型包含数组

时间:2019-02-12 02:05:45

标签: mongodb mongoose

首先,我是MongoDB,Mongoose和Express的新手。我正在尝试创建一个Mongoose模型,该模型具有两个要填充多个名为itemSchema的对象的数组,但是我不确定在不使用findOneAndUpdate的情况下如何更新该数组,但是由于我的数组最初是空的在创建文档之前没有初始ID。使用我在下面定义的方法-食物数组中所有已经存在的数据都将替换为新数组。下面是我的模型-

const mongoose = require("mongoose");

const itemSchema = new mongoose.Schema({
  id: String,
  drinks: [
    {
      id: String,
      name: {
        type: String,
        required: true
      },
      price: {
        type: String,
        required: true
      },
      description: {
        type: String
      },
      date: {
        type: Date,
        default: Date.now
      }
    }
  ],
  food: [
    {
      name: {
        type: String,
        required: true
      },
      price: {
        type: String,
        required: true
      },
      description: {
        type: String
      },
      date: {
        type: Date,
        default: Date.now
      }
    }
  ]
});

module.exports = Item = mongoose.model("item", itemSchema);

我不知道我是否正确定义了架构。我知道它不是很干(因为两个数组都包含相同的类型),但是因为我相信这是一个简单的用例,所以当我只想创建一个模式时,我不想为Drink和Food定义两个单独的模式。

router.post("/food", async (req, res) => {
  try {
    // Create an object from the request that includes the name, price and description
    const newItem = {
      name: req.body.name,
      price: req.body.price,
      description: req.body.description
    };
    // pass the object to the Items model
    let item = new Items(newItem);
    // add to the comments array
    console.log("the new comment ", newItem);
    item.food.unshift(newItem);
    item.save();
    // return the new item array to confirm adding the new item is working.
    res.json(item);
  } catch (error) {
    // Display an error if there is one.
    res.send(404).json(error);
  }
});

上述方法的问题来自我应该如何更新数组。我定义了以下函数来更新food数组,例如,但是每次都会创建一个新数组。我相信这与没有Id参数有关,我可以使用Id参数为模型提供findOneAndUpdate方法。任何帮助将不胜感激。预先谢谢你。

1 个答案:

答案 0 :(得分:0)

根据我的看法,您可以使架构更简单,例如在食品和饮料数组中,所有字段都相同,因此您可以简单地将一个字段作为itemType,然后就不需要将两个字段分开食物和饮料的子文档。

const mongoose = require("mongoose");

const itemSchema = new mongoose.Schema({
  id: String,
  itemType: { type: String },   //  FOOD or DRINK 
  name: {
     type: String,
     required: true
  },
  price: {
      type: String,
      required: true
  },
  description: {
      type: String
  },
  date: {
      type: Date,
      default: Date.now
  }
});  

如果您想了解有关使用findOneAndUpdate()进行数组更新的更多信息,那么我将解释要使用此功能执行的两个简单任务。

情况:1 :如果子文档数组为空,则可以按以下方式在子文档中推送新文档:

    var updatedData = await Model.findOneAndUpdate(
            {
                _id: doc._id           
            },
            { 
                $push: {
                    drinks: {
                        name: drink.name,
                        price: drink.price,
                        description: drink.description,
                    }
                },
            },{ new: true }
    ).lean().exec();

案例:2 如果要通过子文档ID更新现有的子文档,则可以进行以下更新:

var updatedData = await Model.findOneAndUpdate(
            {
                'drink._id': drinkId           
            },
            { 
                $set: {                  
                    'drink.$.name': drink.name,
                    'drink.$.price': drink.price,
                    'drink.$.description': drink.description,
                },
            },{ new: true }
    ).lean().exec();