Skip to content

distalx/tiny-octopus

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Tiny Octopus

This is a POC. DO NOT EVER USE IN PRODUCTION.

travis build codecov coverage version downloads MIT License Commitizen friendly

Prerequisites

  • node v8.x
  • mongodb v3.6.2

Usage

npm install tiny-octopus
const TinyOctopus = require('tiny-octopus');

// Create a new stream.
TinyOctopus(connection, task);
ARGUMENTS

connection Object

Mongodb connection object

task Object

A task object typically includes source collection, destination collections, source_field, destination field, fields.

Very roughly:

{
  source_c: "users",
  destination_c: ['posts', 'comments'],
  source_f: "_id",
  destination_f: "author.id",
  fields: {
    'username': "author.username"
  }
};
Ideal Scenario

It's best suited for Distributed Data Model

i.e. if there are collections like users, posts, comments and user's data is replicated over other collections.

// users
{
  "_id": "1",
  "username": "prateek",
  "city": "Pune"
}
// posts
{
  "_id": "1",
  "title": "Sarcasm is weird. Even not in acting, in life I feel like 'sarcastic' is a word that people use to describe me sometimes so when I meet someone, it's almost like they feel like they have to also be sarcastic, but it can sometimes just come off as mean if it's not used in the right way. ",
  "tags": [
    { "id": "1", "title": "News"},
    { "id": "2", "title": "Spots"}
  ],
  "author": {
    "id": "1",
    "username": "prateek"
  }
}
// comments
{
  "_id": "1",
  "parent_id": "2",
  "text": "Sarcasm is like cheap wine - it leaves a terrible aftertaste.",
  "author": {
    "id": "1",
    "username": "prateek"
  }
}
example
const MongoClient = require('mongodb').MongoClient;
const TinyOctopus = require('tiny-octopus');

MongoClient.connect(db_url, function(err, client) {
  const connection = client.db(db_name)
  TinyOctopus(connection, {
    source_c: "users",
    destination_c: ['posts', 'comments'],
    source_f: "_id",
    destination_f: "author.id",
    fields: {
      'username': "author.username"
    }
  });
});

This will replicate any changes made to the users collection's username field to posts and comments collections.

db.users.update({ "_id": "1"}, {$set: {"username": "Karan"}});

For more details checkout the example section.


Acknowledgements

Thanks to: @wawhal, @karthikvt26 for the feedback.

About

This is a POC. DO NOT EVER USE IN PRODUCTION.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published