Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript MongoDB findAndModify()将查询添加到update子句_Javascript_Node.js_Mongodb - Fatal编程技术网

Javascript MongoDB findAndModify()将查询添加到update子句

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

我正在节点中创建一个应用程序,其中包含一些CRUD组件。在我的一个数据对象上,我有一个
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
映射中。有什么方法可以实现我的目的吗?

您可以使用new
new require('mongodb')生成_id客户端。ObjectID()
然后,您可以只执行常规的upsert(无需执行findandmodify),因为您已经有了_id

但是,如果使用findAndModify,请记住节点驱动程序在位置上接受此函数的参数,而不是作为对象(如常规mongo shell中)。 使用节点驱动程序查找和修改的正确格式如下所示:

collection.findAndModify(条件、排序、更新[、选项、回调])

(选项和回调是可选参数)。完整文档在此:

我实际上使用的是MongoJS,它是本机Mongo驱动程序的包装器,似乎接受对象语法。但是您关于生成id客户端的观点似乎是最好的解决方案。我仍然想知道为什么在upsert过程中查询子句中的条件会被计算并添加到记录中,尽管如此。@DuxPrime这是设计的-如果您提供一个非空查询,“upserting”意味着如果没有文档匹配该查询,它必须创建一个-因此它会被添加到正在创建的记录中。下面应该可以工作_id:this.getId()| | new mongodb.ObjectID()