Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.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
自动将Mongodb对象ID映射到字符串和从字符串映射_Mongodb_Clojure_Monger - Fatal编程技术网

自动将Mongodb对象ID映射到字符串和从字符串映射

自动将Mongodb对象ID映射到字符串和从字符串映射,mongodb,clojure,monger,Mongodb,Clojure,Monger,我正在使用Monger库从Clojure访问Mongo数据库。让我恼火的一件事是在ObjectId实例和字符串之间来回切换 例如,this code(mc/find maps“posts”{}将对值为\u id条目设置为ObjectId类实例的映射进行求值,而在我的应用程序中,我发现将其作为字符串更有用,因为我知道它是唯一的 另一方面,对于以下表达式:(mc/find-map-by-id“posts”(new-ObjectId-id))如果使用字符串对象作为id参数,则必须使用它来构造Objec

我正在使用Monger库从Clojure访问Mongo数据库。让我恼火的一件事是在ObjectId实例和字符串之间来回切换

例如,this code
(mc/find maps“posts”{}
将对值为
\u id
条目设置为
ObjectId
类实例的映射进行求值,而在我的应用程序中,我发现将其作为字符串更有用,因为我知道它是唯一的

另一方面,对于以下表达式:
(mc/find-map-by-id“posts”(new-ObjectId-id))
如果使用字符串对象作为
id
参数,则必须使用它来构造
ObjectId
的实例

是否有一种方法可以使
\u id
的值在应用程序中的字符串和mongo端的ObjectId之间自动、透明地转换?某种选项,如果启用,它会使用ID的字符串表示创建映射,反之亦然,当在查询中用作参数时,它会转换ids t对象ID的字符串表示


如果没有,还有什么其他可用的策略

在这一点上,我和你一样痛苦。取回ObjectID是很烦人的,因为你总是要来回转换,如果你忘记了,那么这是一个很难捕捉的错误

您最好的选择可能是包装驱动程序代码以自动进行转换。因此,用一个薄包装器替换find、findOne、insert,该包装器查看类型并自动进行转换,无论您是进入还是离开


不幸的是,我不认为有更简单的办法。

我参加聚会有点晚,但必须为子孙后代提一提

我不想解决自动str->ObjectID部分,因为让代码理解哪些字符串必须作为ObjectID处理,哪些不能。但是对于ObjectID->str,有一个解决方案

我最终扩展了
monger.conversion/ConvertFromDBObject
协议,如下所示:

(extend-protocol ConvertFromDBObject
    ObjectId
    (from-db-object [input keywordize]
      (str input)))
from db object
在所有read-as-map操作上被调用,因此这解决了读取部分。至于将ObjectID转换为字符串以获得插入和更新的结果,我还没有找到任何优雅的解决方案,并为映射扩展了相同的协议,并在我的包装函数中的插入和更新操作的结果上从db object调用了
。为映射扩展协议如下所示(完全从
DBObject
的原始实现中窃取):

(extend-protocol ConvertFromDBObject
    ; copied over from the implementation for DBObject
    clojure.lang.IPersistentMap
    (from-db-object [input keywordize]
      (reduce (if keywordize
                (fn [m ^String k]
                  (assoc m (keyword k) (from-db-object (.get input k) true)))
                (fn [m ^String k]
                  (assoc m k (from-db-object (.get input k) false))))
              {} (.keySet input))))