mongo_dart 0.4.4
mongo_dart: ^0.4.4 copied to clipboard

Dart native
Flutter Android iOS

MongoDB driver, implemented in pure Dart. All CRUD operations, aggregation pipeline and more!

Mongo-dart - MongoDB driver for Dart programming language #

Pub Build Status

Server-side driver library for MongoDb implemented in pure Dart.

Basic usage #

Obtaining connection #

  var db = Db("mongodb://localhost:27017/mongo_dart-blog");


  var db = await Db.create("mongodb+srv://<user>:<password>@<host>:<port>/<database-name>?<parameters>");

Querying #

Method find returns stream of maps and accept query parameters, usually build by fluent API query builder provided by mongo_dart_query as top level getter where

  var coll = db.collection('user');
  await coll.find("age", 18)).toList();
  await coll
      .find("my_field", 995).sortBy('my_field'))
      .forEach((v) => print(v));

  await coll.find(where.sortBy('itemId').skip(300).limit(25)).toList();

Method findOne take the same parameter and returns Future of just one map (mongo document)

  val = await coll.findOne(where.eq("my_field", 17).fields(['str_field','my_field']));

Take notice in these samples that unlike mongo shell such parameters as projection (fields), limit and skip are passed as part of regular query through query builder

Inserting documents #

  await usersCollection.insertAll([
    {'login': 'jdoe', 'name': 'John Doe', 'email': ''},
    {'login': 'lsmith', 'name': 'Lucy Smith', 'email': ''}

Updating documents #

You can update whole document with method save

  var v1 = await coll.findOne({"name": "c"});
  v1["value"] = 31;

or you can perform field level updates with method update and top level getter modify for ModifierBuilder fluent API

  coll.update(where.eq('name', 'Daniel Robinson'), modify.set('age', 31));

Removing documents #

  /// or, to remove all documents from collection

Simple app on base of JSON ZIPS dataset

import 'package:mongo_dart/mongo_dart.dart';

void main() async {
  void displayZip(Map zip) {
        'state: ${zip["state"]}, city: ${zip["city"]}, zip: ${zip["id"]}, population: ${zip["pop"]}');
  var db =
  var zips = db.collection('zip');
******************** Zips for state NY, with population between 14000 and 16000,
******************** reverse ordered by population''');
  await zips
          .eq('state', 'NY')
          .inRange('pop', 14000, 16000)
          .sortBy('pop', descending: true))
  print('\n******************** Find ZIP for code 78829 (BATESVILLE)');
  var batesville = await zips.findOne(where.eq('id', '78829'));
  print('******************** Find 10 ZIP closest to BATESVILLE');
  await zips
      .find(where.near('loc', batesville["loc"]).limit(10))
  print('closing db');
  await db.close();

Building aggregation queries #

import 'package: mongo_dart/mongo_dart.dart';

main() async {
  final db = Db('mongodb://');
  final pipeline = AggregationPipelineBuilder()
      Match(where.eq('status', 'A').map['\$query']))
        id: Field('cust_id'),
        fields: {
          'total': Sum(Field('amount'))
  final result =
    await DbCollection(db, 'orders')

Secure connection #

You can connect using a secured tls/ssl connection in one of this two ways:

  • setting the secure connection parameter to true in
    await true);
  • adding a query parameter => "tls=true" (or "ssl=true").
    var db = DB('mongodb://');
    var db = DB('mongodb://');

When you use the mongodb+srv url schema, the "tls" (or "ssl") parameter is implicitly considered true.

No certificates can be used.

Atlas (MongoDb cloud service) connection #

Atlas requires a tls connection, so now it is possible to connect to this cloud service. When creating a cluster Atlas shows you three ways of connecting: Mongo shell, Driver and MongoDb Compass Application. The connection string is in Seedlist Connection Format (starts with mongodb+srv://).

Take the Url related to the Driver mode and pass it to Db.create().

Please, not that Db.create is an asynchronous constructor, so you have to await for it.

  var db = await Db.create("mongodb+srv://<user>:<password>@<host>:<port>/<database>?<parameters>");

See also #