我尝试定义并使用带有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
值的问题。
答案 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。