Node.js 更新在shell中工作但不在nodejs驱动程序中的查询

Node.js 更新在shell中工作但不在nodejs驱动程序中的查询,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,此查询在mongo shell中运行 db.orders.updateOne({ _id: ObjectId("5e26be38c13b7149d0a95111"), "submittedTo":ObjectId("5e2555363405363bc4bf86c2") }, { $set: { ... "vendorOrder" : [ ... { ... "_id" : ObjectId("

此查询在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响应:
{“确认”:true,“匹配计数”:1,“修改计数”:1}

但它在nodejs中不起作用:以下是我迄今为止所做的尝试 查询1:

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);
  }
};
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 } }
        );
{
    "orders": {
        "n": 0,
        "nModified": 0,
        "ok": 1
    },
    "message": "order submitted"
}
查询2

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带双“rest”的代码完全相同

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);
  }
};
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 } }
        );
{
    "orders": {
        "n": 0,
        "nModified": 0,
        "ok": 1
    },
    "message": "order submitted"
}
邮差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
                }
        ]
邮差回复

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);
  }
};
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 } }
        );
{
    "orders": {
        "n": 0,
        "nModified": 0,
        "ok": 1
    },
    "message": "order submitted"
}
两点意见:

查询#2(或#3)是正确的-您应该始终使用
mongoose.Types.ObjectId(…)
将字符串转换为
ObjectId
,因为这两个字段都作为字符串存储在数据库中

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

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

当您的有效负载包含提交到
字段的
submittedTo
时,需要
dealerId
,因此您应该尝试:

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
之间没有任何更改。

谢谢@mickl,但即使在编辑邮递员有效负载后,它仍然会给出相同的响应,尽管我更改了有效负载{“orderId”:“5e26be38c13b7149d0a95111”,“提交至”:“5e2555363405363bc4bf86c2”剩余有效载荷相同,但内部交易副本的变化除外vendorOrder@sachin我试过了,效果很好。你能粘贴你的
Order
schema吗?const orderSchema=new mongoose.schema({vendoroder:[{publicationCode:{type:String},publicationName:{type:String},editionName:{type:String},productCode:{type:String},subscriptionCopies:{type:Number},tradeCopies:{type:Number}],提交到:{type:mongoose.Schema.Types.ObjectId}@mickl@sachin看起来不错。下面是我的工作示例:,请确保您连接到的数据库已包含集合和您尝试修改的文档(集合名称应为
orders
)我不知道我的代码有什么问题,我被困在这里面了,db里有相同id的文档,我在mongoshell用相同的查询修改了它,同样的id在问题中也是相同的