猫鼬更新/ upsert?

时间:2012-03-12 02:33:36

标签: javascript node.js mongodb mongoose

我查看了网站上的一些问题,但还没弄清楚我做错了什么。我有一些像这样的代码:

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);
    });
  });
};

我不确定我应该在中间做什么来让它正确地更新数据库。我已经尝试了很多东西,无法撤消以找出我尝试过的所有内容。这是我晚上的很大一部分,我希望它有效。

这几乎是我想要的,我想知道在.update()

的条件部分是否有办法进行OR
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(){});
};

我会继续玩弄它。

5 个答案:

答案 0 :(得分:12)

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

这正是我想要的,它是一行。 :D完美!

答案 1 :(得分:9)

使用findOneAndUpdate并将'upsert'选项设置为true。

答案 2 :(得分:0)

这个怎么样(没有测试,但 应该使用最新的mongoose):

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

答案 3 :(得分:0)

首先,您需要为特定集合定义模式

用户架构:

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

在代码中使用

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

答案 4 :(得分:0)

您可以使用findOneAndUpdate()并需要设置{new: true}。 您可以根据默认情况下的“新”来检查4.0.0 release notes 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    
  });
);
相关问题