簡體   English   中英

findOneAndUpdate 僅提供部分更新

[英]findOneAndUpdate provides only a partial update

我正在嘗試更新數據庫文檔,具體取決於用戶輸入以及它是否存在(如果不存在則創建它)。 用戶可以檢索一家公司的股票價格,並喜歡它一次。

 async function run() { var price = await getPrice(query.stock); if (!price) { return res.json({ stockData: { error: "stock not found" } }); } if (!Array.isArray(query.stock)) { MongoClient.connect(CONNECTION_STRING, function(err, client) { var db = client.db("mydb"); db.collection("stock").findOne({ stock: query.stock.toUpperCase() }, (err, doc) => { if (err) throw err; if (!doc && !query.like) { return res.send({ stockData: { stock: query.stock.toUpperCase(), price: price, likes: 0 } }); } if (doc && !query.like) { return res.send({ stockData: { stock: query.stock.toUpperCase(), price: price, likes: doc.likes } }); } if (!doc && query.like) { db.collection("stock").insertOne({ stock: query.stock.toUpperCase(), likes: 1, ips: [req.ip] }); return res.send({ stockData: { stock: query.stock.toUpperCase(), price: price, likes: 1 } }); } if (doc && query.like) { if (!doc.ips.includes(req.ip)) { db.collection("stock").findOneAndUpdate( { stock: query.stock.toUpperCase() }, { $inc: { likes: 1 } }, { $addToSet: { ips: req.ip } }, { returnOriginal: false }, (err, updoc) => { if (err) throw err; return res.send("test"); } ); } return res.send({ stockData: { stock: query.stock.toUpperCase(), price: price, likes: doc.likes } }); } }); }); } }

我的問題是 findOneAndUpdate 操作。 應該是增加點贊數,把用戶的ip加到數組里,這樣他們就不能再點贊了。 它按照應有的方式執行前者,但數組保持不變。 事實上,其他對它的操作也沒有結果。 更重要的是,程序永遠不會進行回調,不會返回“test”,也不允許我訪問更新文檔 updoc。

根據文檔,這是您應該更新文檔的方式

 db.collection.findOneAndUpdate(
   <filter>,
   <update>,
   {
     projection: <document>,
     sort: <document>,
     maxTimeMS: <number>,
     upsert: <boolean>,
     returnNewDocument: <boolean>
   }
)

所以所有Update東西都應該在第二個參數中,所以像這樣更新你的代碼

db.collection("stock").findOneAndUpdate(
              { stock: query.stock.toUpperCase() },
              { $inc: { likes: 1 } , $addToSet: { ips: req.ip } },
              { returnNewDocument: false },
              (err, updoc) => {
                if (err) throw err;
                return res.send("test");
              }
            );

因為我不知道returnOriginal但我知道屬性returnNewDocument ,默認情況下它是false ,但是如果您想明確提及它,這完全取決於您。

Model.findOneAndUpdate({...query}, {...operations}, { new: true })

我認為這是針對貓鼬的,但您也可以使用returnNewDocument: true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM