2012-03-12 28 views
7

Tôi đã xem xét một số câu hỏi trên trang web và không tìm ra những gì tôi đang làm sai. Tôi có một số mã như sau:Mongoose update/upsert?

var mongoose = require('mongoose'), 
db = mongoose.connect('mongodb://localhost/lastfm'), 
Schema = mongoose.Schema, 
User = new Schema({ 
    nick: String, 
    hmask: String, 
    lastfm: String 
}); 
var UserModel = mongoose.model('User', User); 

//Register user to mongodb 
var reg_handler = function (act) { 
// should add a new entry to the db if nick (act.nick) && hmask (act.host) 
// aren't already in the db. Otherwise, update the entry that matches nick 
// or hostmask with the new lastfm name (act.params) 
}; 

var get_handler = function (act) { 
    UserModel.find({ nick: act.params }, function (err, users) { 
    if (err) { console.log(err) }; 
    users.forEach(function (user) { 
     console.log('url for user is http://url/' + user.lastfm); 
    }); 
    }); 
}; 

Tôi không chắc mình nên làm gì ở giữa để cập nhật cơ sở dữ liệu đúng cách. Tôi đã thử một vài điều, không thể hoàn tác để tìm hiểu tất cả những gì tôi đã thử mặc dù. Nó chiếm một phần lớn trong đêm của tôi và tôi muốn nó hoạt động.

này là gần như những gì tôi muốn, tôi tự hỏi nếu có cách nào để làm một HOẶC trong điều kiện một phần của .update()

var reg_handler = function (act) { 
    var lfmuser = { nick: act.nick, hmask: act.host, lastfm: act.params }; 
    UserModel.update({ nick: act.nick }, { $set: lfmuser }, { upsert: true }, function(){}); 
}; 

tôi sẽ tiếp tục đùa giỡn đùa với nó.

Trả lời

10
var reg_handler = function (act) { 
    UserModel.update({ $or: [{nick: act.nick}, {hmask: act.host}] }, { $set: { lastfm: act.params } }, { upsert: true }, function(){}); 
}; 

này thực hiện chính xác những gì tôi muốn, và đó là một dòng. : D Tuyệt vời!

+5

Bạn có thể muốn thêm một số lỗi xử lý cho chức năng cuối cùng;) – staackuser2

0

Làm thế nào về vấn đề này (chưa kiểm tra, nhưng nên làm việc với mongoose mới nhất):

UserModel.findAndModify({nick: act.nick, hmask: act.host}, [], {$set: {lastfm: act.params}}, {}, callback); 
+0

Sẽ kiểm tra nó, đã làm cho nó hoạt động với .update() cuối cùng. Tôi không biết những gì tôi đã làm sai trước đây, nhưng nó hoạt động tốt ngay bây giờ. – Rob

+0

Không, điều này làm hỏng nó. Sẽ trả lời với những gì tôi cuối cùng đã làm việc. – Rob

9

Sử dụng findOneAndUpdate với tùy chọn 'upsert' được đặt thành true.

+2

Có lý do nào tại sao điều này tốt hơn (hoặc tệ hơn) so với 'Model.update()' trong câu trả lời được chấp nhận không? – joeytwiddle

+1

@joeytwiddle những gì tôi sẽ đề nghị là nếu bạn muốn chỉ cập nhật và không lấy lại hồ sơ, sau đó làm Cập nhật mô hình, nếu không, findOneAndUpdate sẽ hoạt động nếu bạn muốn ghi lại. –

0

đầu tiên bạn cần xác định schema cho bộ sưu tập đặc biệt

dùng schema:

username: {type: String, required: true, upsert: true }

sử dụng trong mã:

.findOne({ emailId: toEmail }) 
.update({$set: { username: ravi }}) 
.exec() 
0

Bạn có thể sử dụng findOneAndUpdate() và nhu cầu để đặt {new: true}. Bạn có thể kiểm tra 4.0.0 release notes, theo đó "mới" theo mặc định false.

UserModel.findOneAndUpdate(
    { nick: act.nick },  //your condition for check 
    { $set: lfmuser },  //new values you want to set 
    { upsert: true, 'new': true }).exec(function (err, data){ 
     //your result  
    }); 
);