更新查询可在Shell中工作,但不能在nodejs驱动程序中工作

问题描述 投票:1回答:1

此查询在mongo shell中运行

db.orders.updateOne({ _id: ObjectId("5e26be38c13b7149d0a95111"),
"submittedTo":ObjectId("5e2555363405363bc4bf86c2") },
{ $set: {
    ... "vendorOrder" : [
    ...                 {
    ...                         "_id" : ObjectId("5e26be38c13b7149d0a95113"),
    ...                         "publicationCode" : "TOI",
    ...                         "publicationName" : "Times of India",
    ...                         "editionName" : "chennai city",
    ...                         "productCode" : "TCE1",
    ...                         "subscriptionCopies" : 70,
    ...                         "tradeCopies" : 9
    ...                 },
    ...                 {
    ...                         "_id" : ObjectId("5e26be38c13b7149d0a95112"),
    ...                         "publicationCode" : "ET",
    ...                         "publicationName" : "Economic Times",
    ...                         "editionName" : "chennai city",
    ...                         "productCode" : "ECE1",
    ...                         "subscriptionCopies" : 20,
    ...                         "tradeCopies" : 4
    ...                 }
    ...         ]}})

Mongo shell响应: { "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

但是它的在nodejs中不起作用:到目前为止,这是我尝试过的query1:

exports.editOrder = async (req, res, next) => {
  const { orderId, dealerId, vendorOrder } = req.body;
try {
    const orders = await Order.updateOne(
      {
        _id: orderId,
        submittedTo:dealerId
      },
      { $set: { vendorOrder } }
    );
 res.status(200).json({
      orders,
      message: "order submitted"
    });
  } catch (error) {
    res.send(error);
  }
};

query2

exports.editOrder = async (req, res, next) => {
  const { orderId, dealerId, vendorOrder } = req.body;

  try {
    const orders = await Order.updateOne(
      {
        _id: mongoose.Types.ObjectId(orderId),
        submittedTo: mongoose.Types.ObjectId(dealerId)
      },
      { $set: { vendorOrder: vendorOrder } }
    );
 res.status(200).json({
      orders,
      message: "order submitted"
    });
  } catch (error) {
    res.send(error);
  }
};

查询3带双“”其余代码完全相同

const { orderId, dealerId, vendorOrder } = req.body;

      try {
        const orders = await Order.updateOne(
          {
            "_id": mongoose.Types.ObjectId(orderId),
            "submittedTo": mongoose.Types.ObjectId(dealerId)
          },
          { $set: { "vendorOrder": vendorOrder } }
        );

POSTMAN JSON:

{
    "orderId":"5e26be38c13b7149d0a95111",
    "submittedTo":"5e2555363405363bc4bf86c2",
    "vendorOrder" : [
                {
                   "_id" : "5e26be38c13b7149d0a95113",
                   "publicationCode" : "TOI",
                   "publicationName" : "Times of India",
                   "editionName" : "chennai city",
                   "productCode" : "TCE1",
                   "subscriptionCopies" : 70,
                   "tradeCopies" : 90
                },
                {
                    "_id" : "5e26be38c13b7149d0a95112",
                    "publicationCode" : "ET",
                    "publicationName" : "Economic Times",
                    "editionName" : "chennai city",
                    "productCode" : "ECE1",
                    "subscriptionCopies" : 20,
                    "tradeCopies" : 40
                }
        ]

邮递员回复

{
    "orders": {
        "n": 0,
        "nModified": 0,
        "ok": 1
    },
    "message": "order submitted"
}
node.js mongodb mongoose
1个回答
0
投票

两句话:

查询#2(或#3)正确-您应该始终使用ObjectId将字符串转换为mongoose.Types.ObjectId(...)

您的代码的下一个问题是您的解构:

const { orderId, dealerId, vendorOrder } = req.body;

期望dealerId,而您的有效载荷包含submittedTo字段,因此您应该尝试:

const { orderId, submittedTo, vendorOrder } = req.body;

const orders = await Order.updateOne(
    {
        _id: mongoose.Types.ObjectId(orderId),
        submittedTo: mongoose.Types.ObjectId(submittedTo)
    },
    { $set: { vendorOrder: vendorOrder } }
);

这很好用(请注意,如果nModified变量和0之间没有任何更改存储在数据库中,则vendorOrder将作为vendorOrder返回。

© www.soinside.com 2019 - 2024. All rights reserved.