Javascript MongoDB findAndModify()将查询添加到update子句
我正在节点中创建一个应用程序,其中包含一些CRUD组件。在我的一个数据对象上,我有一个Javascript MongoDB findAndModify()将查询添加到update子句,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我正在节点中创建一个应用程序,其中包含一些CRUD组件。在我的一个数据对象上,我有一个save()方法,如果对象的id在集合中找到,则该方法用于更新记录,如果没有,则用于向上插入新文档。此外,如果执行upsert,我希望返回Mongo生成的文档的_id 它似乎可以做到这一点,实际上,它确实从数据库返回了一个_id值。在我的查询子句中,我按_id进行筛选。如果我的数据对象没有id,Mongo会正确地执行upsert,但是,无论它返回什么_id值,除了我在update子句中设置的键外,它还根据我在q
save()
方法,如果对象的id在集合中找到,则该方法用于更新记录,如果没有,则用于向上插入新文档。此外,如果执行upsert,我希望返回Mongo生成的文档的_id
它似乎可以做到这一点,实际上,它确实从数据库返回了一个_id值。在我的查询子句中,我按_id进行筛选。如果我的数据对象没有id,Mongo会正确地执行upsert,但是,无论它返回什么_id值,除了我在update
子句中设置的键外,它还根据我在query
子句中使用的值在文档上设置_id。为了清晰起见,有一些代码:
User.prototype.save = function(callback) {
var that = this;
var args = {
'query' : { _id: this.getId() }, //getId() returns empty string if not set
'update' : { $set : {
firstName : this.firstName,
lastName : this.lastName,
email : this.email
//_id : this.getId()
// which is blank, is magically getting added due to query clause
}},
'new' : true,
'upsert' : true,
'fields' : {'_id' : true}
};
this.db.collection(dbName).findAndModify(args, function(err, doc){
if(!that.getId()) {
that.setId(doc._id);
}
if (typeof(callback) === "function"){
callback.call(that);
}
});
}
我只是在寻找update的语义,它恰好在upsert上返回Mongo生成的_id。我不希望
query
子句的值附加在update
映射中。有什么方法可以实现我的目的吗?您可以使用newnew require('mongodb')生成_id客户端。ObjectID()
然后,您可以只执行常规的upsert(无需执行findandmodify),因为您已经有了_id
但是,如果使用findAndModify,请记住节点驱动程序在位置上接受此函数的参数,而不是作为对象(如常规mongo shell中)。
使用节点驱动程序查找和修改的正确格式如下所示:
collection.findAndModify(条件、排序、更新[、选项、回调])
(选项和回调是可选参数)。完整文档在此:
我实际上使用的是MongoJS,它是本机Mongo驱动程序的包装器,似乎接受对象语法。但是您关于生成id客户端的观点似乎是最好的解决方案。我仍然想知道为什么在upsert过程中查询子句中的条件会被计算并添加到记录中,尽管如此。@DuxPrime这是设计的-如果您提供一个非空查询,“upserting”意味着如果没有文档匹配该查询,它必须创建一个-因此它会被添加到正在创建的记录中。下面应该可以工作_id:this.getId()| | new mongodb.ObjectID()