我有一個我想使用 findOneAndUpdate 更新的物件,但它似乎不起作用..我已經嘗試使用 $ 運算子但它不起作用但是一旦我洗掉 $ 運算子呼叫顯示錯誤。
MongoServerError: Cannot create field 'categoryfilter' in element {store: [ { productname: "monitor", price: 1500, quantity: 5, categoryfilter: "Monitors", description: "tests", timestamp: "December 24th 2021, 1:39:36 pm", _id: ObjectId('61c55d687d8ff305de3ed044'), 0: { categoryfilter: "Monitors", description: "testsss", price: 1500, productname: "monitor", quantity: 5, timestamp: "December 24th 2021, 1:39:36 pm" } } ]} at MessageStream.messageHandler (C:\Users\gamex\Desktop\my files\goldenwell\server\node_modules\mongodb\lib\cmap\connection.js:467:30)
at MessageStream.emit (events.js:376:20)
at processIncomingData (C:\Users\gamex\Desktop\my files\goldenwell\server\node_modules\mongodb\lib\cmap\message_stream.js:108:16)
at MessageStream._write (C:\Users\gamex\Desktop\my files\goldenwell\server\node_modules\mongodb\lib\cmap\message_stream.js:28:9)
at writeOrBuffer (internal/streams/writable.js:358:12)
at MessageStream.Writable.write (internal/streams/writable.js:303:10)
at TLSSocket.ondata (internal/streams/readable.js:745:22)
at TLSSocket.emit (events.js:376:20)
at addChunk (internal/streams/readable.js:309:12)
at readableAddChunk (internal/streams/readable.js:284:9) {
operationTime: new Timestamp({ t: 1640325515, i: 17 }),
ok: 0,
code: 28,
codeName: 'PathNotViable',
'$clusterTime': {
clusterTime: new Timestamp({ t: 1640325515, i: 17 }),
signature: {
hash: new Binary(Buffer.from("c08511e0a3727ac6636aa2c56b4587cfcf0c2396", "hex"), 0),
keyId: new Long("7013342858887299079")
}
}
}
這是我使用貓鼬創建的架構。
import mongoose from 'mongoose';
const OwnerSchema = mongoose.Schema({
username: {
require: true,
type: String,
},
password: {
require: true,
type: String,
},
isAdmin: {
type: Boolean,
default: true,
},
store: [
{
productname: {
type: String,
required: true,
},
price: {
type: Number,
required: true,
},
quantity: {
type: Number,
required: true,
},
categoryfilter: {
type: String,
required: true
},
description: {
type: String,
required: true,
},
imageBase64: {
type: String,
required: true,
},
timestamp: {
type: String,
required: true,
}
}
]
});
const OwnerModels = mongoose.model('OwnerModels', OwnerSchema);
export default OwnerModels;
這是我的更新查詢。我嘗試使用 $ 運算子,但似乎根本沒有用,因此將其洗掉。
export const updateProduct = async (req,res) => {
const { id } = req.params;
try {
if(!mongoose.Types.ObjectId.isValid(id)) return res.status(404).json({ message: 'Invalid ID' });
await OwnerModels.findOneAndUpdate({'_id': id, store:{ $elemMatch: { productname: req.body.store[0].productname }}},
{$set:
{
"store.productname": req.body.store[0].productname,
"store.price": req.body.store[0].price,
"store.quantity": req.body.store[0].quantity,
"store.categoryfilter": req.body.store[0].categoryfilter,
"store.description": req.body.store[0].description,
"store.timestamp": req.body.store[0].timestamp
}
},
{new: true, safe: true, upsert: true}, (error, response) => {
if(error){
console.log(error)
}else{
console.log(response)
}
}
);
} catch (error) {
res.status(404).json(error)
}
}
uj5u.com熱心網友回復:
因為store是一個陣列,mongodb 無法知道store您的{ $set: { 'store.categoryfilter': ... } }陳述句要更新哪個元素。
該$elemMatch查詢僅用于檔案級別的查詢過濾器,它不會挑選特定store元素進行更新。
正確的選擇是在update陳述句中使用arrayFilter
uj5u.com熱心網友回復:
嘗試OwnerModel 使用 a檢索findByid,然后store使用該push方法更新陣列。
您將需要使用該save方法保存更新的物件。
const owner = await OwnerModels.findByid(id);
if (!owner) {
return res.status(404).json({ message: "Owner not found" });
}
owner.store.push(req.body.store);
await owner.save();
res.status(200).json({ message: "Updated" })
最后,您可能想要default 向該imageBase64欄位添加一個值,因為我沒有看到它列在您的正文引數中:
imageBase64: {
type: String,
required: true,
default: ""
},
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/393903.html
