在持久性mongodb中定义并使用Text列作为id

时间:2014-09-14 09:29:30

标签: haskell persistent

我尝试定义并使用带有Text列的表(AKA集合)作为唯一ID。我使用2.0.2版本的持久性,持久性mongodb,持久模板。

这是我的表定义:

let mongoSettings = (mkPersistSettings (ConT ''MongoContext)) { mpsGeneric = False }
  in  share [mkPersist mongoSettings, mkMigrate "migrateAll"][persistUpperCase|
User id=myid
  myid     Text
  count    Int
|]

我无法弄清楚如何从Key User值创建Text。 我试过了:

mkUser :: Text -> Key User
mkUser x = UserKey . MongoKey $ x

编译错误:

Couldn't match type ‘Text’ with ‘ObjectId’
Expected type: Text -> Key User
  Actual type: ObjectId -> Key User

持久性中的mongo键是否只允许为ObjectId类型?从我对相关source code的考察来看,情况似乎是这样,但我希望自己错了。 Mongodb肯定允许文本键在持久性之外。实际上,它允许any unique thing

我也试过像这样插入一行:

insert $ User "bob" 0

但结果数据库行在ObjectId列中有一个自动生成的_id,而不是"bob"

如果我定义架构:

User sql=profiles
  _id    Text
  count  Int

然后我仍然遇到尝试定义Key User Text值的问题。

1 个答案:

答案 0 :(得分:2)

这是persistent-mongoDB中的一个新功能(当我提出问题时没有这个功能),所以过去的答案是“不,这是不可能的”#34;但是现在是#34;是的,这就是"。它可以从2.0.3系列开始使用:persistent-2.0.3,persistent-template-2.0.3和persistent-mongoDB-2.0.3。

您的架构应该有一行:Id <type of _id field>例如:

let mongoSettings = (mkPersistSettings (ConT ''MongoContext)) { mpsGeneric = False }
  in  share [mkPersist mongoSettings][persistUpperCase|
User
  Id   Text
  age  Int
|]

并插入具有特定_id的文档,如下所示:

insertKey (UserKey "alice") $ User 1

另见wiki