【问题标题】:Mapping Mongodb ObjectId to and from string automatically自动将 Mongodb ObjectId 映射到字符串和从字符串映射
【发布时间】:2012-07-13 17:52:18
【问题描述】:

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

例如,此代码 (mc/find-maps "posts" {}) 将评估为将 _id 条目的值设置为 ObjectId 类实例的映射,而在我的应用程序中,我发现简单地将其作为字符串用于我知道它是独一无二的。

另一方面,对于像(mc/find-map-by-id "posts" (new ObjectId id)) 这样的表达式,我确实为id 参数使用了一个String 对象,我必须使用它来构造ObjectId 的一个实例。

有没有办法让_id的值在应用程序中的Strings和mongo端的ObjectId之间自动透明地转换?某种选项,当启用时,创建带有 id 的字符串表示形式的映射,反之亦然,当用作查询中的参数时,将字符串表示形式的 ids 转换为对象 ids?

如果没有,还有哪些其他可用的策略?

【问题讨论】:

    标签: mongodb clojure monger


    【解决方案1】:

    我在这一点上与您分享痛苦。取回 ObjectID 很烦人,因为您总是需要来回转换,如果您忘记了,就很难发现错误。

    最好的办法可能是包装驱动程序代码以自动进行转换。因此,将 find、findOne、insert 替换为一个薄包装器,该包装器会查看类型并自动进行转换,无论您是进来还是出去。

    很遗憾,我认为没有更简单的方法。

    【讨论】:

      【解决方案2】:

      我参加聚会有点晚了,但必须为后代提及。

      我不打算解决自动 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 转换为插入和更新结果的字符串,我还没有找到任何优雅的解决方案,并为地图扩展了相同的协议,并在我的包装函数中的插入和更新操作的结果上调用了 from-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))))
      

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2012-01-23
        • 2012-08-21
        • 2011-02-10
        • 1970-01-01
        • 2016-12-09
        • 2021-02-13
        • 2018-07-09
        • 2020-02-23
        相关资源
        最近更新 更多