使用update()获取受影响文档的ID

时间:2015-09-20 12:44:39

标签: mongodb meteor mongodb-query

我正在用它做一个upsert:

Articles.update(
    { title: title },
    { 
        title: title,
        parent: type
    },
    { upsert: true }, 
    function(res) {
        return console.log(res);
    }
);

console.log(needToGetID);

现在我需要获取已更新或插入的文档的_id。我以为我可以通过回调得到它,但res未定义。 我假设只有一个由查询定义的唯一文档。

更新

忘记提到我正在使用流星......

1 个答案:

答案 0 :(得分:6)

.update()的目的是基本上只是"更新"匹配的文件(因为"多"也可以在这里应用)并且完成它,因此特别考虑到这个"可以"应用于多个文档然后返回此类信息在该操作方面没有任何意义。

但是,如果您打算修改单个"特定文档",假设您使用的是猫鼬,那么.findOneAndUpdate()方法将适用:

Articles.findOneAndUpdate(
    { title: title },
    {
        title: title,
        parent: type
    },
    { upsert: true, new: true  }, 
    function(res) {
        return console.log(res);
    }
);

另请注意new: true这很重要,因为没有它,默认行为是返回文档"之前"它被声明修改了。

无论如何,由于此处的返回是匹配和修改的文档,因此响应中会出现_id和任何其他值。

使用meteor,您可以添加plugin以启用.findAndModify()这是根方法:

meteor add fongandrew:find-and-modify

然后在代码中:

Articles.findAndModify(
    {
        "query": { title: title },
        "update": {
            title: title,
            parent: type
        },
        "upsert": true, 
        "new": true  
    }, 
    function(res) {
        return console.log(res);
    }
);

请注意,您也应该真正使用$set运算符,因为没有它,基本上更改"覆盖"目标文件:

Articles.findAndModify(
    {
        "query": { "title": title },
        "update": {
            "$set": {
                "parent": type
            }
        },
        "upsert": true, 
        "new": true  
    }, 
    function(res) {
        return console.log(res);
    }
);