by Konsultaner, Richard Burkhardt
This Project aims to be provide a json object document mapper.
Why would I need this?
There are many cases where you do not want to have the server query your data. You may also see this mapper as a fancy way to filter your data or prepare a view model.
The original use case was an ionic app that was not interactive so providing a server backend was not needed, but structuring my data
into joinable collections seemed very helpful.
And if you can use a server you may consider our new WebSocket server project "connectanum" for Publish/Subscribe and RPC communication
If you like the project please support it with a star here on GitHub
If commercial support is needed please contact me.
You can find the documentation here or compiled to the folder /docs/gen/*.
- Implement query methods from mongo db
- Comparison 100%
- $eq
- $gt
- $gte
- $lt
- $lte
- $ne
- $in
- $nin
- Logical 100%
- $or
- $and
- $not(= $nand as alias)
- $nor
- Element 100% (+ $isNull, for is null or undefined)
- $exists
- $type
- Evaluation 100%
- $mod
- $regex
- $text
- $where
- Geospatial 50% (maybe have a hard and a soft check -> performance)
- $geoWithin
- $geoIntersects
- $near
- $nearSphere
- Array 0% i may not implement the first two
- $all
- $elementMatch
- $size
- Aggregation
- Pipeline 30% ($limit and $skip is implemented as $result(skip,limit))
- $project
- $match
- $redact
- $limit
- $skip
- $unwind
- $sort
- $geoNear
- $out
- Grouping 70% ($count is used to count the results)
- $group
- $count
- $sum
- $avg
- $first
- $last
- $min
- $max
- $push
- $addToSet
- Operators 20% ($mod is renamed $modulo, because Evaluation has a $mod)
- Boolean
- Set
- Comparison
- Arithmetic
- String
- Array
- Date
- Conditional
- Variable
- Grouping
- Pipeline 30% ($limit and $skip is implemented as $result(skip,limit))
- Comparison 100%
- Support Promise/A+ sources for the odm.addSource
- Full CRUD support
- Aggregation
npm install json-odm
Since PhantomJs has been archived, jsonOdm needed to switch to chrome headless for its test. To run tests have Chrome installed!
npm install json-odm
cd npm_modules/json-odm/
npm install
gulp
Unit test ran successfully under Chrome,iOS7+,IE9+,Firefox,Android 4.4.2+
To be tested: Safari on OSX, IE8(test driver does not run in IE < 9 so it will be hard to test)
This is only a basic example. Find a lot more in the docs, i.e. how to use $geoWithin
<!-- add minified version from https://github.com/konsultaner/jsonOdm/tree/master/bin to the html head -->
<script type="text/javascript" src="js/json.odm.min.js"></script>
// initialize The mapper
var odm = new jsonOdm();
// add a source to the mapper
odm.addSource('people',{
"Person" : [
{"id":1,"name":"Richi",jobId:1,hobbyIds:[1,3,4]},
{"id":2,"name":"Dave",jobId:2,hobbyIds:[2,4]},
{"id":3,"name":"Tom",jobId:3,hobbyIds:[3,5]},
{"id":4,"name":"Lisa",jobId:4,hobbyIds:[1,2,3]},
{"id":5,"name":"Hanni",jobId:3,hobbyIds:[1,5]},
{"id":6,"name":"Selma",jobId:3,hobbyIds:[1,4]},
{"id":7,"name":"Ralf",jobId:1,hobbyIds:[4,3]}
],
"Jobs" : [
{"id":1,"name":"plumber"},
{"id":2,"name":"programmer"},
{"id":3,"name":"chef"},
{"id":4,"name":"hairdresser"}
],
"Hobbies" : [
{"id":1,"name":"swimming"},
{"id":2,"name":"cycling"},
{"id":3,"name":"fishing"},
{"id":4,"name":"coding"},
{"id":5,"name":"dancing"}
]
},true);
// instantiate a collection object
var people = new odm.Collection('Person');
people.$hasOne("jobId","id","Jobs","job");
people.$hasMany("hobbyIds","id","Hobbies","hobbies");
var q = people.$query();
// get all hairdresser and plumber
var hairdresser = q.$or(
q.$branch("jobId").$eq(1),
q.$branch("jobId").$eq(4)
).$all();
// get all but hairdressers and plumbers
var hairdresser = q.$and(
q.$branch("jobId").$ne(1),
q.$branch("jobId").$ne(4)
).$all();
// delete all plumbers
q.$branch("job","name").$eq("plumber").$delete();