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

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


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';

main() async {
  void displayZip(Map zip) {
        'state: ${zip["state"]}, city: ${zip["city"]}, zip: ${zip["id"]}, population: ${zip["pop"]}');
  Db db =
      new Db("mongodb://");
  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')

See also


Server-side driver library for MongoDb implemented in pure Dart. As most of IO in Dart, mongo_dart is totally async -using Futures and Streams. .