【问题标题】:How To Push mutiple array elements into mongod by mongoose如何通过 mongoose 将多个数组元素推送到 mongodb
【发布时间】:2020-08-02 20:14:14
【问题描述】:

有一个包含这些字段的mongodb Schema,它的类型是数组

......
orderlist: [
    {
      id: String,
      price: Number,
      photo: String,
      name: String,
      num: Number
    }
  ]
......

前端发给我这样的数据,这个数组有很多数组元素

goodslist:[
  {
    goodsid: '10001',
    goodsprice: 20,
    goodsphoto: '/goodsimg/upload_1843.jpg',
    goodsname: 'goods1',
    goodsnum: 2
  },
  {
    goodsid: '10002',
    goodsprice: 30,
    goodsphoto: '/goodsimg/upload_1845.jpg',
    goodsname: 'goods2',
    goodsnum: 4
  },
........(etc)
]

如何在不更改 mongodb 字段的情况下通过 mongoose 将这个 'goodslist' 数据推送到 'orderlist' 字段中,谢谢

【问题讨论】:

    标签: javascript arrays mongodb typescript mongoose


    【解决方案1】:

    您必须使用mongoose virtuals 来解决此问题。

    您的架构必须是这样的:

    const mongoose = require('mongoose');
    const Schema = mongoose.Schema;
    const collectionName = 'orderlist';
    
    const OrderSchema = new Schema({
      id: String,
      price: Number,
      photo: String,
      name: String,
      num: Number
    }, { minimize: false });
    
    const OrderlistSchema = new Schema({
      orderList: [OrderSchema]
    }, { minimize: false, toJSON: { virtuals: true } });
    
    OrderlistSchema.virtual('goodslist').
      get(function () {
        return this.orderList.map(order => ({
          goodsid: order.id,
          goodsprice: order.price,
          goodsphoto: order.photo,
          goodsname: order.name,
          goodsnum: order.num
        }))
      }).
      set(function (v) {
        this.set({
          orderList: v.map(good => ({
            id: good.goodsid,
            price: good.goodsprice,
            photo: good.goodsphoto,
            name: good.goodsname,
            num: good.goodsnum
          }))
        });
      });
    
    module.exports = mongoose.model('Orderlist', OrderlistSchema, collectionName);
    
    

    goodslist 是这里的虚拟字段。 使用此模式,您可以使用您的格式设置订单字段,而无需更改 mongodb 中的任何内容。 过帐文件示例:

    {
      "goodslist": [
        {
          "goodsid": 2,
          "goodsprice": 200,
          "goodsphoto": "photo2",
          "goodsname": "name2",
          "goodsnum": 1234
        }
      ]
    }
    

    还可以获取goodlist格式的订单数据

    {
        "_id": "5e9d8c0e27c7a813840c9ff0",
        "orderList": [
            {
                "_id": "5e9d8c0e27c7a813840c9ff1",
                "id": "2",
                "price": 200,
                "photo": "photo2",
                "name": "name2",
                "num": 1234
            }
        ],
        "__v": 0,
        "goodslist": [
            {
                "goodsid": "2",
                "goodsprice": 200,
                "goodsphoto": "photo2",
                "goodsname": "name2",
                "goodsnum": 1234
            }
        ],
        "id": "5e9d8c0e27c7a813840c9ff0"
    }
    

    【讨论】:

      【解决方案2】:

      它将类似于以下内容:

      //Update order | create if does not exist
                              orderDB.updateOne({ _id: 'xxxx' }, {
      
                                  //Push the list into order array
                                  $push: {
                                      orderlist: [{
                                          id: goodlist[0][0],
                                          price: goodlist[0][1],
                                          photo: goodlist[0][2],
                                          name: goodlist[0][3],
                                          num: goodlist[0][4],
                                      }]
                                  }
      
                                  //Upsert => update / create
                              }, { upsert: true })
      

      但是,您可能需要遍历商品列表。

      【讨论】:

        猜你喜欢
        • 2016-01-20
        • 2020-07-08
        • 2020-12-30
        • 2013-01-21
        • 1970-01-01
        • 2015-12-09
        • 1970-01-01
        • 2013-09-27
        相关资源
        最近更新 更多