Node.js 更新在shell中工作但不在nodejs驱动程序中的查询
此查询在mongo shell中运行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("
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在问题中也是相同的