0

我有一个findAndModifyMongoDb 请求。mongo 服务器将文档包装在:

{
    value: { ... },
    lastErrorObject: { updatedExisting: true, n: 1 },
    ok: 1
}

有没有办法只从value密钥中获取对象?

{ ... }
4

1 回答 1

0

获得这种响应的唯一方法是直接运行findAndModify数据库命令表单,例如:

db.runCommand({
    "findAndModify": "newdata", 
    "query": { "a": 1 }, 
    "update": { "$set": { "b": 2 } }, 
    "new": true, 
    "upsert": true 
})

在 MongoDB shell 和所有驱动程序实现中,这些方法总是用一个集合方法包装,以便在响应中只返回被修改的文档(或原始文档,如果您要求的话)。在 shell 中,包装代码如下所示:

function (args){
    var cmd = { findandmodify: this.getName() };
    for (var key in args){
    cmd[key] = args[key];
    }

    var ret = this._db.runCommand( cmd );
    if ( ! ret.ok ){
        if (ret.errmsg == "No matching object found"){
        return null;
        }
        throw "findAndModifyFailed failed: " + tojson( ret );
    }
    return ret.value;
}

因此,当您实际上只是从集合对象中调用该方法时,您只需获取文档作为响应:

db.newdata.findAndModify({ 
    "query": { "a": 1 }, 
    "update": { "$set": { "b": 2 } }, 
    "new": true, 
    "upsert": true 
})

{ "_id" : ObjectId("5445af1ac745bf5663de72dd"), "a" : 1, "b" : 2 }

这对所有驱动程序都是通用的,其中一些驱动程序显示“findAndModify”的替代名称,例如“findAndUpdate”,并专门区分每个驱动程序的“删除”和“更新”功能。有关其他实现的更多详细信息,请参阅您的语言驱动程序文档,但它们基本上以相同的方式工作。

于 2014-10-21T01:11:07.323 回答