【问题标题】:Upate DB in Mongo DB C++ Driver在 Mongodb C++ 驱动程序中更新数据库
【发布时间】:2014-10-28 07:03:47
【问题描述】:

Mongo DB 的 C++ 驱动程序在 update() 上返回 void,这与客户端返回写入结果以指示正在更新的文档数量不同。据我了解,影响 0 个文档的更新操作是完全合法的结果,因此不会引发异常。

    virtual void insert( const std::string &ns, BSONObj obj , int flags=0) = 0;
    virtual void insert( const std::string &ns, const std::vector< BSONObj >& v , int flags=0) = 0;
    virtual void remove( const std::string &ns , Query query, bool justOne = 0 ) = 0;
    virtual void remove( const std::string &ns , Query query, int flags ) = 0;
    virtual void update( const std::string &ns,
                         Query query,
                         BSONObj obj,
                         bool upsert = false, bool multi = false ) = 0;
    virtual void update( const std::string &ns, Query query, BSONObj obj, int flags ) = 0;

我之所以问这个问题是因为我正在通过数据库执行 Upsert,我想知道 Upsert 是创建了新文档还是更新了数据库。如果没有写入结果,我无法有效地确定 upsert 的结果。

1)c++驱动不提供return是有原因的吗

2) 在这种情况下,是否有适当的方法来检索写入结果,而无需对数据库执行查询。

【问题讨论】:

  • 我希望您需要调用 getLastError,其中包含受命令影响的文档数的 n

标签: c++ mongodb


【解决方案1】:

getLastErrorDetailed() 似乎是答案:

(*conn)->update(...);    
BSONObj obj = (*conn)->getLastErrorDetailed();      
const string err_msg = (*conn)->getLastErrorString(obj);    
int n = obj.getIntField("n");    

【讨论】:

    【解决方案2】:

    getLastError() 仅在新旧版 (legacy_1.0.0-rc0) c++ 驱动程序中返回错误字符串: std::string getLastError(bool fsync = false, bool j = false, int w = 0, int wtimeout = 0); 看不到写结果怎么找回来的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      相关资源
      最近更新 更多