自动将Mongodb对象ID映射到字符串和从字符串映射
我正在使用Monger库从Clojure访问Mongo数据库。让我恼火的一件事是在ObjectId实例和字符串之间来回切换 例如,this code自动将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
(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))))