【问题标题】:How to select array of object in mongoose?如何在猫鼬中选择对象数组?
【发布时间】:2021-08-11 23:39:30
【问题描述】:

我一直在尝试更新 uisng nodejs 和 mongoose 的订单状态。但是我在更新状态时遇到了问题。

我一直在尝试从 ORDER 文档(表格)访问购物车。我想将购物车内的状态从“已打包”更改为“已转移”。我整天都在尝试,但找不到解决方案。请帮帮我。如何使用 nodejs 选择购物车并更改 mongoose 中的状态?

订购

{
    "_id": {
        "$oid": "60a9a8b2bc65933bb4c22a3b"
    },
    "cart": [{
        "_id": {
            "$oid": "60a8bcafe7815c2950de4b28"
        },
        "userId": "60a3ad7fb51de12a5472de37",
        "count": "1",
        "status": "packed",
        "__v": 0
    }],
    "userId": "60a3ad7fb51de12a5472de37",
    "fName": "jay sree",
    "street": "5th cross hindurous",
    
}

型号

const mongoose = require('mongoose')

const schema = mongoose.Schema

const orderSchema = new schema(
  {
    userId: {
      type: String,
      required: true
    },
      cart: [{
          type: Object
      }],
      fName: {
      type: String,
      required: true
    },
    street: {
      type: String,
    },
  },
  {
    timestamps: true,
  }
);

module.exports = mongoose.model("Order", orderSchema)

控制器

exports.postUpdateStatus = (req, res, next) => {
    let status = req.params.status //shifted
    let productId =  mongoose.Types.ObjectId(req.params.productid )//60a8bcafe7815c2950de4b28
    let orderId = mongoose.Types.ObjectId(req.params.orderid )//60a9a8b2bc65933bb4c22a3b
    Order.find({id: orderId})
    .select({ cart: {$elemMatch: {id: productId}}})
    .then(product => {
        res.jsonp(product)
    })
    .catch(err => {
        console.log(err)
    })
}

【问题讨论】:

    标签: node.js database mongoose


    【解决方案1】:

    您可以调用findOneAndUpdate 函数并使用positional operator 更新匹配的购物车项目。比如:

    Order.findOneAndUpdate({
        "_id": "60a9a8b2bc65933bb4c22a3b",
        "cart._id": "60a8bcafe7815c2950de4b28"
    }, {
        "$set": {
            "cart.$.status": "shifted"
        }
    }, {
        new: true
    });
    

    请注意,我在这里使用new-选项,以便将findOneAndUpdate 转换为return the updated document

    这是 mongoplayground 上的一个示例,您可以在其中使用查询:https://mongoplayground.net/p/5sW7NB1mJK7

    【讨论】:

    • 我试过了,但它没有更新任何东西。我哪里做错了?我需要上传更多信息吗?
    • 您可以尝试将您的ids 显式转换为猫鼬ids 吗?例如。 let productId = mongoose.Types.ObjectId(req.params.productid); 对两个 ID 执行此操作。
    • 是的!也试过了,还是没有变化。有没有其他选择?
    • 我做了一些更改Order.findOneAndUpdate({"cart._id": productId }, { $push: {"cart.status": status}}, {new: true}) 并使我的代码像这样,现在我收到一个错误,提示无法创建字段。知道是什么问题吗?
    • 谢谢。有效。只是我按照你说的更新了控制器,但模型有问题。
    猜你喜欢
    • 2016-05-03
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2021-08-20
    • 2021-08-23
    • 1970-01-01
    • 2015-12-28
    • 2021-05-06
    相关资源
    最近更新 更多