Description
The official MongoDB driver for Swift applications on macOS and Linux
mongo-swift-driver alternatives and similar libraries
Based on the "API" category.
Alternatively, view mongo-swift-driver alternatives based on common mentions on social networks and blogs.
-
Typhoon
Powerful dependency injection for Objective-C ✨✨ (https://PILGRIM.PH is the pure Swift successor to Typhoon!!)✨✨ -
Dip
Simple Swift Dependency container. Use protocols to resolve your dependencies and avoid singletons / sharedInstances! -
Telegram Vapor Bot (SDK for creating Telegram Bots in Swift)
🤖 The wrapper for the Telegram Bot API written in Swift. It's not a framework. There is no special syntax here. This is a library that implements all Telegram Bot API methods, which is available to you to work with Vapor, Smoke, Hummingbird, FlyingFox. -
Federal Data SDK
DISCONTINUED. Federal Data SDK built in the Swift programming language. Follow the link for the documentation: -
Kraken
Simple Dependency Injection container for Swift. Use protocols to resolve dependencies with easy-to-use syntax! -
PPWeatherCheck
Incorporate with CoreLocation, Cocoapods, REST APIs, Alamofire, JSON, and UI Animation to Create a Weather Check Application.
CodeRabbit: AI Code Reviews for Developers
* Code Quality Rankings and insights are calculated and provided by Lumnify.
They vary from L1 to L5 with "L5" being the highest.
Do you think we are missing an alternative of mongo-swift-driver or a related project?
Popular Comparisons
README
MongoSwift
The official MongoDB driver for Swift applications on macOS and Linux.
Index
Documentation
The latest documentation for the driver is available here. The latest documentation for the driver's BSON library is available here.
Bugs / Feature Requests
Think you've found a bug? Want to see a new feature in mongo-swift-driver
? Please open a case in our issue management tool, JIRA:
- Create an account and login: jira.mongodb.org
- Navigate to the SWIFT project: jira.mongodb.org/browse/SWIFT
- Click Create Issue - Please provide as much information as possible about the issue and how to reproduce it.
Bug reports in JIRA for all driver projects (i.e. NODE, PYTHON, CSHARP, JAVA) and the Core Server (i.e. SERVER) project are public.
Security Concerns
Please see [SECURITY.md](SECURITY.md) for details on our security process.
Installation
The driver supports use with Swift 5.1+. The minimum macOS version required to build the driver is 10.14. The driver is tested in continuous integration against macOS 11 and 12, and Ubuntu 18.04 and 20.04.
Installation is supported via Swift Package Manager.
You can find details about all our versions in this repo's releases page.
Step 1: Install Required System Libraries (Linux Only)
The driver vendors and wraps the MongoDB C driver (libmongoc
), which depends on a number of external C libraries when built in Linux environments. As a result, these libraries must be installed on your system in order to build MongoSwift.
To install those libraries, please follow the instructions from libmongoc
's documentation.
Step 2: Install the driver
The driver contains two modules to support a variety of use cases: an asynchronous API in MongoSwift
, and a synchronous API in MongoSwiftSync
. The modules share a number of core types such as options struct
s.
The driver depends on our library swift-bson
, containing a BSON implementation. All BSON symbols are re-exported from the drivers' modules, so you do not need to explicitly import BSON
in your application.
To install the driver, add the package and relevant module as a dependency in your project's Package.swift
file:
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "MyPackage",
platforms: [
.macOS(.v10_14) // minimum macOS version driver supports
],
dependencies: [
.package(url: "https://github.com/mongodb/mongo-swift-driver", .upToNextMajor(from: "1.3.1"))
],
targets: [
// Async module
.target(name: "MyAsyncTarget", dependencies: ["MongoSwift"]),
// Sync module
.target(name: "MySyncTarget", dependencies: ["MongoSwiftSync"])
]
)
Then run swift build
to download, compile, and link all your dependencies.
Example Usage
Note: You should call cleanupMongoSwift()
exactly once at the end of your application to release all memory and other resources allocated by libmongoc
.
Connect to MongoDB and Create a Collection
Async/Await (recommended):
import MongoSwift
import NIOPosix
let elg = MultiThreadedEventLoopGroup(numberOfThreads: 4)
let client = try MongoClient("mongodb://localhost:27017", using: elg)
defer {
// clean up driver resources
try? client.syncClose()
cleanupMongoSwift()
// shut down EventLoopGroup
try? elg.syncShutdownGracefully()
}
let db = client.db("myDB")
let collection = try await db.createCollection("myCollection")
// use collection...
Async (EventLoopFuture
s):
import MongoSwift
import NIOPosix
let elg = MultiThreadedEventLoopGroup(numberOfThreads: 4)
let client = try MongoClient("mongodb://localhost:27017", using: elg)
defer {
// clean up driver resources
try? client.syncClose()
cleanupMongoSwift()
// shut down EventLoopGroup
try? elg.syncShutdownGracefully()
}
let db = client.db("myDB")
let result = db.createCollection("myCollection").flatMap { collection in
// use collection...
}
Sync:
import MongoSwiftSync
defer {
// free driver resources
cleanupMongoSwift()
}
let client = try MongoClient("mongodb://localhost:27017")
let db = client.db("myDB")
let collection = try db.createCollection("myCollection")
// use collection...
Note: we have included the client connectionString
parameter for clarity, but if connecting to the default "mongodb://localhost:27017"
it may be omitted.
Create and Insert a Document
Async/Await (recommended):
let doc: BSONDocument = ["_id": 100, "a": 1, "b": 2, "c": 3]
let result = try await collection.insertOne(doc)
print(result?.insertedID ?? "") // prints `.int64(100)`
Async (EventLoopFuture
s):
let doc: BSONDocument = ["_id": 100, "a": 1, "b": 2, "c": 3]
collection.insertOne(doc).whenSuccess { result in
print(result?.insertedID ?? "") // prints `.int64(100)`
}
Sync:
let doc: BSONDocument = ["_id": 100, "a": 1, "b": 2, "c": 3]
let result = try collection.insertOne(doc)
print(result?.insertedID ?? "") // prints `.int64(100)`
Find Documents
Async/Await (recommended):
let query: BSONDocument = ["a": 1]
// The `sort` option specifies the order in which results are returned
// via the cursor. In this case, `["_id": -1]` indicates that the documents will
// be returned in descending order according to the `_id` field.
let options = FindOptions(sort: ["_id": -1])
for try await doc in try await collection.find(query, options: options) {
print(doc)
}
Async (EventLoopFuture
s):
let query: BSONDocument = ["a": 1]
// The `sort` option specifies the order in which results are returned
// via the cursor. In this case, `["_id": -1]` indicates that the documents will
// be returned in descending order according to the `_id` field.
let options = FindOptions(sort: ["_id": -1])
let result = collection.find(query, options: options).flatMap { cursor in
cursor.forEach { doc in
print(doc)
}
}
Sync:
let query: BSONDocument = ["a": 1]
// The `sort` option specifies the order in which results are returned
// via the cursor. In this case, `["_id": -1]` indicates that the documents will
// be returned in descending order according to the `_id` field.
let options = FindOptions(sort: ["_id": -1])
let documents = try collection.find(query, options: options)
for d in documents {
print(try d.get())
}
Work With and Modify Documents
var doc: BSONDocument = ["a": 1, "b": 2, "c": 3]
print(doc) // prints `{"a" : 1, "b" : 2, "c" : 3}`
print(doc["a"] ?? "") // prints `.int64(1)`
// Set a new value
doc["d"] = 4
print(doc) // prints `{"a" : 1, "b" : 2, "c" : 3, "d" : 4}`
// Using functional methods like map, filter:
let evensDoc = doc.filter { elem in
guard let value = elem.value.asInt() else {
return false
}
return value % 2 == 0
}
print(evensDoc) // prints `{ "b" : 2, "d" : 4 }`
let doubled = doc.map { elem -> Int in
guard case let value = .int64(value) else {
return 0
}
return Int(value * 2)
}
print(doubled) // prints `[2, 4, 6, 8]`
Note that BSONDocument
conforms to Collection
, so useful methods from
Sequence
and
Collection
are
all available. However, runtime guarantees are not yet met for many of these
methods.
Usage With Kitura, Vapor, and Perfect
The Examples/
directory contains sample web application projects that use the driver with Kitura, Vapor, and Perfect.
We also have an example full-stack Swift app with an iOS frontend and a backend built with Vapor.
Please note that the driver is built using SwiftNIO 2, and therefore is incompatible with frameworks built upon SwiftNIO 1. SwiftNIO 2 is used as of Vapor 4.0 and Kitura 2.5.
Development Instructions
See our development guide for instructions for building and testing the driver.