![](/img/trans.png)
[英]MongoDB - Mongoose query findOneAndUpdate() doesn't update/duplicates the DB
[英]Mongoose findOneAndUpdate doesn't find (or update) in Node
我正在嘗試將用戶輸入(url)添加到具有 Mongoose 的數據庫中,但也檢查添加的數據是否已經存在。 相反,它似乎每次都在創建一個新的 model。
這在屏幕上顯示了 res.json(input),而不是測試 json
var mongo = require('mongodb');
var mongoose = require('mongoose');
var cors = require('cors');
// Basic Configuration
var port = process.env.PORT || 3000;
process.env.DB_URI="omg it's my secret url"
// Connect to DB.
mongoose.connect(process.env.DB_URI, { useNewUrlParser: true, useUnifiedTopology: true }).
catch(error => handleError(error));
mongoose.connection.on('error', err => {
console.log(err);
});
app.use(cors());
//First we create a schema and Model in MongoDB.
const urlSchema = new mongoose.Schema({
original_url: String,
short_url: Number
});
const urlModel = mongoose.model('urlModel', urlSchema);
app.post(/PATH, function(req, res, done) {
//Now we check if the input-url was actually valid.
if(!/(^https:\/\/)/.test(req.body.url)){
res.json({error: "Invalid url"});
}
//If it's valid we will start creating a model in the DB.
else {
var userUrl = req.body.url;
var urlNumber = 0;
var input = new urlModel({
original_url: userUrl
});
//Now we check if the url was already added to the database and return a new or updated item.
urlSchema.pre('save', function (next) {
var query = {'original_url': userUrl };
urlModel.findOneAndUpdate(query, userUrl, {upsert: true}, function(err, doc) {
if (err) return res.send(500, {error: err});
res.json({'test': 'test'});
});
});
res.json(input);
urlNumber++;
input.save(function(err, data) {
if (err) return console.log(err);
done(null, data);
});
};
});
如您所見,我在更新要附加到數據庫中的 url 的號碼時也遇到了問題,因為我在調用開始時將 0 重新分配給了 urlNumber。 一定是因為時間晚了,但我似乎找不到正確更新該號碼的方法。 我嘗試了兩個變量並相互檢查它們和一個 if(urlNumber > 0),但這是一個我仍在解決的問題。 看起來很簡單。。
無論如何,這里的問題是:為什么 findOneAndUpdate 似乎沒有更新? 返回的 res.json(input) 每次都會顯示一個新的“_id”,這告訴我它確實在每次運行時都創建了新模型。
返回示例
#1
{
_id: eksdjh3948wryeids293ren12;
original_url: "https://www.correct.com"
short_url: 0
}
#2
{
_id: eksdjh3948wryeids293ren13; // (<----- NEW NUMBER)
original_url: "https://www.correct.com"
short_url: 0
}
你的pre('save' function(next) {})
鈎子沒有調用next()
原來 .pre 掛鈎不適用於 findOneAndUpdate,如果我只是刪除它。 代碼現在按預期工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.