🐈 Meow
Meow 是由 MongoKitten 制造商创建的一个无样板对象持久性框架,适用于 Swift 和 MongoDB。
它为您管理数据库,这样您就可以专注于编写应用程序。
它如何工作
Meow 有一个管理数据库的 Manager
类型。您需要为每个 NIO 事件循环创建一个。管理器是围绕 MongoKitten 的小型包装,负责连接、发现和重新连接。
从您的管理器中,您可以创建一个上下文,将上下文视为在单个任务中相关的某物。任务可能是运行迁移或响应 HTTP 请求。
在您的上下文中,模型被缓存和引用。因此,如果第二次获取相同的用户,只要它当前上下文内可用,Meow 就会第二次引用原始实例。强烈建议解决依赖于此机制的引用。
创建模型
创建模型时,您需要使您的 class
符合 Model
。唯一的要求是,您需要向您的模型添加一个 key 为 _id
且不 是 计算属性的属性。
final class User: Model {
var _id = ObjectId()
...
}
只要它是一个标准 BSON Primitive
类型,您就可以为 _id
键使用任何类型,包括
- ObjectId
- String
- Double
- Int
- Int32
Binary
/Data
以下是完全合法的
// Stores the username in _id
final class User: Model {
var _id: String
var username: String {
return _id
}
...
默认情况下,模型名称将用作集合名称。您可以使用 static let collectionName: String
来自定义此名称。
final class User: Model {
// Changes the collection name from `User` to `users`
static let collectionName = "users"
var _id = ObjectId()
...
查询
查询位于 上下文
中。
引用
final class Article: Model {
var _id = ObjectId()
let creator: Reference<User>
var title: String
var text: String
...
上述示例展示了如何创建到另一个模型(例如用户模型)的简单引用。下面将演示解析引用的过程。
let resolvedUser = article.creator.resolve(in: context)
在这种情况下,结果是 EventLoopFuture
,但如果您希望当引用的目标不存在时将其解析为 nil
,则可以直接执行 article.creator.resolveIfPresent(in: context)
。
您还可以使用 reference.deleteTarget(in: context)
删除引用的目标。这意味着默认解析方式(不是使用 ifPresent
)将导致失败。
不支持的功能
如果某个功能由 Meow 不支持,例如当它不能是类型安全的时,您始终可以回退到 MongoKitten。
let database: MongoKitten.Database = context.manager.database
🐈 社区
⭐️ 功能
- 无需样板代码
- 如此简单,让您满心欢喜,或者全额退款!
- 惊人的类型安全自动完成查询
- 支持自定义 MongoDB 查询
- 轻松迁移到新的模型版本
- 使用 Codable 支持您自己的类型(如结构体和枚举)和常见类型(如 String、Int 和 Date),无需额外配置