我正在Node中创建一个具有一些CRUD组件的应用程序。在我的一个数据对象上,我有一个save()方法,该方法用于在对象具有在集合中找到的ID的情况下更新记录,或者如果没有则添加新文档。另外,如果要进行upsert,我想找回Mongo生成的文档的_id。

看来findAndModify会这样做,并且确实确实从数据库返回了_id值。在我的查询子句中,我正在按_id进行过滤。如果我的数据对象没有id,Mongo会正确执行upsert,但是,无论返回的_id值是多少,除了我在update子句中设置的键之外,它还会基于文档设置_id我在query子句中使用了什么值。为了清楚起见,一些代码:

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

我只是在寻找更新的语义,该语义也会在upsert上返回Mongo生成的_id。我不希望query子句的值被附加附加,就好像它们在update映射中一样。有什么方法可以实现我的目标吗?

最佳答案

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

但是,如果您使用的是findAndModify,请记住, Node 驱动程序在位置上而不是在对象上(例如在常规mongo shell中)接受该函数的参数。
使用 Node 驱动程序进行查找和修改的正确格式如下所示:
collection.findAndModify(criteria, sort, update[, options, callback])
(选项和回调是可选参数)。完整的文档在这里:
https://github.com/mongodb/node-mongodb-native/blob/master/docs/insert.md

关于javascript - MongoDB findAndModify()将查询添加到update子句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10222509/

10-10 10:20