• Stars
    star
    325
  • Rank 129,350 (Top 3 %)
  • Language
    Swift
  • License
    Apache License 2.0
  • Created almost 7 years ago
  • Updated over 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

The official MongoDB driver for Swift

Development Pause

We are announcing our decision to stop development of the MongoDB server-side Swift driver. No further development, bug fixes, enhancements, documentation changes or maintenance will be provided by this project and pull requests will no longer be accepted.

There are still ways to use MongoDB with Swift:

  • Use the MongoDB driver with server-side Swift applications as is
  • Use the MongoDB C Driver directly in your server-side Swift projects
  • Usage of another community Swift driver, mongokitten

Community members and developers are welcome to fork our existing driver and add features as you see fit - the Swift driver is under the Apache 2.0 license and source code is available on GitHub. For those developing client/mobile applications, MongoDB offers the Realm Swift SDK with real time sync to MongoDB Atlas.

We would like to take this opportunity to express our heartfelt appreciation for the enthusiastic support that the Swift community has shown for MongoDB. Your loyalty and feedback have been invaluable to us throughout our journey, and we hope to resume development on the server-side Swift driver in the future.

sswg:incubating|104x20

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:

  1. Create an account and login: jira.mongodb.org
  2. Navigate to the SWIFT project: jira.mongodb.org/browse/SWIFT
  3. 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 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 structs. 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 (EventLoopFutures):

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 (EventLoopFutures):

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 (EventLoopFutures):

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.

More Repositories

1

mongo

The MongoDB Database
C++
26,192
star
2

node-mongodb-native

The official MongoDB Node.js driver
TypeScript
10,030
star
3

mongo-go-driver

The Official Golang driver for MongoDB
Go
8,135
star
4

laravel-mongodb

A MongoDB based Eloquent model and Query builder for Laravel (Moloquent)
PHP
6,997
star
5

mongo-python-driver

PyMongo - the Official MongoDB Python driver
Python
4,129
star
6

mongoid

The Official Ruby Object Mapper for MongoDB
Ruby
3,922
star
7

mongo-csharp-driver

The Official C# .NET Driver for MongoDB
C#
3,038
star
8

mongo-java-driver

The official MongoDB drivers for Java, Kotlin, and Scala
Java
2,568
star
9

motor

Motor - the async Python driver for MongoDB and Tornado or asyncio
Python
2,410
star
10

mongo-php-library

The Official MongoDB PHP library
PHP
1,594
star
11

mongo-hadoop

MongoDB Connector for Hadoop
Java
1,519
star
12

mongo-ruby-driver

The Official MongoDB Ruby Driver
Ruby
1,422
star
13

mongo-rust-driver

The official MongoDB Rust Driver
Rust
1,268
star
14

mongodb-kubernetes-operator

MongoDB Community Kubernetes Operator
Go
1,218
star
15

js-bson

BSON Parser for node and browser
TypeScript
1,130
star
16

mongo-php-driver-legacy

Legacy MongoDB PHP driver
PHP
1,093
star
17

mongo-cxx-driver

C++ Driver for MongoDB
C++
1,040
star
18

mongo-tools

Go
994
star
19

homebrew-brew

The Official MongoDB Software Homebrew Tap
Ruby
924
star
20

mongo-php-driver

The Official MongoDB PHP driver
PHP
838
star
21

mongo-c-driver

The Official MongoDB driver for C language
C
815
star
22

docs

The MongoDB Documentation Project Source.
Java
738
star
23

mongo-spark

The MongoDB Spark Connector
Java
706
star
24

casbah

Casbah is now officially end-of-life (EOL).
Scala
514
star
25

bson-rust

Encoding and decoding support for BSON in Rust
Rust
402
star
26

specifications

Specifications related to MongoDB
Python
383
star
27

mongo-snippets

snippets of code that might be useful for your mongodb deployment
C++
381
star
28

cookbook

MongoDB recipes.
Ruby
354
star
29

pymodm

A Pythonic, object-oriented interface for working with MongoDB.
Python
351
star
30

mongo-perf

performance tools for mongodb
JavaScript
350
star
31

libbson

ARCHIVED - libbson has moved to https://github.com/mongodb/mongo-c-driver/tree/master/src/libbson
C
347
star
32

mongo-kafka

MongoDB Kafka Connector
Java
342
star
33

mongo-efcore-provider

MongoDB Entity Framework Core Provider
C#
329
star
34

mongodb-enterprise-kubernetes

MongoDB Enterprise Kubernetes Operator
Dockerfile
325
star
35

mongo-scala-driver

Scala
286
star
36

terraform-provider-mongodbatlas

Terraform MongoDB Atlas Provider: Deploy, update, and manage MongoDB Atlas infrastructure as code through HashiCorp Terraform
Go
242
star
37

leafygreen-ui

LeafyGreen UI – LeafyGreen's React UI Kit
TypeScript
219
star
38

mongodb-atlas-cli

MongoDB Atlas CLI and MongoDB CLI enable you to manage your MongoDB in the Cloud
Go
161
star
39

mongodb-atlas-kubernetes

MongoDB Atlas Kubernetes Operator - Manage your MongoDB Atlas clusters from Kubernetes
Go
148
star
40

stitch-examples

MongoDB Stitch Examples
Java
138
star
41

chatbot

MongoDB Chatbot Framework. Powered by MongoDB and Atlas Vector Search.
TypeScript
135
star
42

support-tools

For support tools to be shared publicly
Go
127
star
43

stitch-js-sdk

MongoDB Stitch JavaScript SDK
TypeScript
113
star
44

mongo-bi-connector-odbc-driver

ODBC driver for MongoDB Connector for Business Intelligence
C
110
star
45

mongo-azure

C#
103
star
46

amboy

Amboy -- A Go(lang) Job Queue Tool
Go
98
star
47

helm-charts

Smarty
94
star
48

libmongocrypt

Required C library for Client Side and Queryable Encryption in MongoDB
C
94
star
49

bsonspec.org

site for bsonspec.org
HTML
92
star
50

terraform-aws-ecs-task-definition

A Terraform module for creating Amazon ECS Task Definitions
HCL
85
star
51

go-client-mongodb-atlas

Go Client for MongoDB Atlas
Go
79
star
52

docs-ecosystem

MongoDB Ecosystem Documentation
Python
77
star
53

bson-ruby

Ruby Implementation of the BSON Specification (2.0.0+)
Ruby
77
star
54

mongo-java-driver-reactivestreams

The Java Reactive Stream driver for MongoDB
Java
73
star
55

mongodbatlas-cloudformation-resources

MongoDB Atlas CloudFormation Resources: Deploy, update, and manage MongoDB Atlas infrastructure as code through AWS CloudFormation
Go
59
star
56

stitch-android-sdk

MongoDB Stitch Android SDK
Java
57
star
57

genny

πŸ§žβ€β™€οΈ Grants 3 wishes. As long as those wishes are to generate load πŸ§žβ€β™‚οΈ
C++
49
star
58

winkerberos

A native Kerberos client implementation for Python on Windows
C
47
star
59

docs-realm

Realm Database SDK documentation
Kotlin
44
star
60

bson-numpy

This project has been superseded by PyMongoArrow - https://github.com/mongodb-labs/mongo-arrow/tree/main/bindings/python
C
43
star
61

stitch-ios-sdk

Swift
42
star
62

docs-tools

Common tools and content for MongoDB documentation projects.
Python
42
star
63

swift-bson

pure Swift BSON library
Swift
41
star
64

signal-processing-algorithms

Python
41
star
65

mongo-jdbc-driver

JDBC Driver for MongoDB Atlas SQL interface
Java
38
star
66

design

Source code for MongoDB.design, LeafyGreen's official documentation site.
TypeScript
36
star
67

mongo-hhvm-driver

MongoDB HHVM driver **Note, this driver is no longer maintained**
PHP
35
star
68

awscdk-resources-mongodbatlas

MongoDB Atlas AWS CDK Resources
TypeScript
35
star
69

mongodb-vapor

MongoDB + Vapor integration
Swift
34
star
70

atlas-billing

JavaScript
33
star
71

atlas-app-services-examples

Example use cases for Atlas App Services
JavaScript
32
star
72

mongo-java-driver-rx

The MongoDB Java RX driver is now officially end-of-life (EOL)
Java
30
star
73

snooty

MongoDB Documentation front end
JavaScript
29
star
74

mongo-csharp-analyzer

The MongoDB Analyzer is a free tool that helps you understand how your code translates into the MongoDB Query API.
C#
27
star
75

realm-practice

realm-node-practice & realm-swift-practice
Swift
24
star
76

charts-embedding-examples

charts-embedding-examples
HTML
23
star
77

ftdc

utils for working with mongodb full-time diagnostic data capture files
Go
23
star
78

mongo-csharp-driver-jsondotnet

The C#/.NET driver will have a new component to integrate with JSON.NET that needs to live separately from the .NET driver itself.
C#
22
star
79

template-app-react-native-todo

Atlas Template Starter App - Use Device Sync from a React Native client application. This repo is generated from source code in https://github.com/mongodb-university/realm-template-apps
TypeScript
21
star
80

mongo-odbc-driver

Rust
20
star
81

marian

A search engine focused on documentation.
JavaScript
20
star
82

curator

Curator -- a build and package automation tool
Go
19
star
83

mongo-qa

General QA materials for Mongo
Java
19
star
84

anser

Data Transformation/Migration Tool
Go
19
star
85

snooty-parser

Python
19
star
86

academia-mongodb-lab-python

Lab using MongoDB with Python (PyMongo driver). Created for educational use by the MongoDB for Academia program.
Jupyter Notebook
19
star
87

kbson

Kotlin Multiplatform Bson Library
Kotlin
18
star
88

docs-compass

Python
18
star
89

docs-bi-connector

Makefile
17
star
90

atlas-sdk-go

MongoDB Atlas Golang SDK
Go
17
star
91

snooty-vscode

TypeScript
17
star
92

terraform-provider-mongodbatlas-archive

ARCHIVED ---- Hashicorp Terraform Provider for MongoDB Atlas - please use https://github.com/terraform-providers/terraform-provider-mongodbatlas
Go
17
star
93

mongo-aspnetcore-odata

Adds MongoDB support to Microsoft ASP.NET Core oData.
C#
16
star
94

template-app-swiftui-todo

Atlas Template Starter App - Use Device Sync from a SwiftUI client application. This repo is generated from source code in https://github.com/mongodb-university/realm-template-apps
Swift
16
star
95

docs-worker-pool

TypeScript
15
star
96

jasper

Jasper is a Process Management Framework
Go
15
star
97

grip

Go
15
star
98

go-client-mongodb-ops-manager

An HTTP client for Ops Manager and Cloud Manager Public API endpoints.
Go
15
star
99

vault-plugin-secrets-mongodbatlas

ARCHIVED - Hashicorp Vault MongoDB Atlas Secrets Engine - Now hosted at https://github.com/hashicorp/vault-plugin-secrets-mongodbatlas/
Go
15
star
100

docs-java

MongoDB Java driver documentation
Java
14
star