2016-07-14 47 views
0

我想切換,每當單擊一個按鈕更新數據庫中的布爾值..
我的HTML:貓鼬findByIdAndUpdate法切換和更新數據庫中的布爾值

<form action="/browse/<%= book._id %>/sold" method="GET"> 
    <button type="submit"> Mark As Sold </button> 
</form> 

架構:

var bookSchema = new mongoose.Schema({ 
    title: String, 
    description: String, 
    sold: { type:Boolean, default: false } 
}); 

我試圖用這個不用彷徨路線:

Book.findByIdAndUpdate(req.params.id, {$set: {sold: !sold} }, function(err, book){ 
.... 
} 

,但它不工作。(出售是不確定的)

我是新來表達和貓鼬和谷歌上搜索了很多,但無法找到一個解決方案。請幫忙。 有沒有其他解決方法?

+0

可以顯示如何和你在哪裏賣聲明變量,它可能是一個範圍問題。 – rresol

+0

@resres實際上我沒有聲明它在任何地方......我雖然它會切換數據庫中的出售價值。只是意識到我錯了。有什麼辦法可以引用已經在數據庫中的值嗎? –

+0

你想要做什麼? – rresol

回答

0

您正在使用的方法不起作用。您在此片段中引用undeclared變量sold{sold: !sold}。如果有的話,你想要做{sold: !this.sold},但thisfindById是一個查詢,而不是模型。您必須使用findById作爲您想要的書,手動更新它(book.sold = !book.sold)然後save它。

你可以在你的模型上創建一個靜態方法來完成所有這些。

它看起來像

bookSchema.statics.findByIdAndToggleSold = function(id, callback){ // Your code to find, then update here. }

+0

謝謝!這對我有效:D –

1

有可悲的是沒有辦法在一個單一的操作,直接反轉的紀錄 - 如果你想操作上只是布爾值,你需要找到,變異,然後保存正如奧斯汀所說。

如果你可以稍微改變你的數據,我們實際上可以用整數來近似。如果我們使用整數,我們可以使用按位操作來完成此操作,例如

Book.insert({myBoolVal: 0}); // Insert as false 
Book.findAndUpdate(req.params.id, {$bit: {myBoolVal: {xor: 1}}}); // 0 xor 1 = 1; 1 xor 1 = 0 
Book.find({myBoolVal: 0}); // false 
Book.find({myBoolVal: 1}); // true 

在這種情況下,你的貓鼬模型必須指定myBoolVal是一個整數。這需要Int32包,截至此答案:Mongoose ODM: NumberInt is not defined。例如:

var NumberInt = require("mongoose-int32"); 
var bookSchema = new mongoose.Schema({ 
    title: String, 
    description: String, 
    sold: { NumberInt, default: 0} 
}); 
0

你可以只在這個便捷的方式更新文件:

Book.findOne({ _id: req.params.id }, function(err, book) { 
    book.sold = !book.sold; 
    book.save(function(err, updatedBook) { 
     ... 
    }); 
});