@@ -245,7 +245,7 @@ ShareDbMongo.prototype.getSnapshot = function(collectionName, id, fields, option
245
245
this . getCollection ( collectionName , function ( err , collection ) {
246
246
if ( err ) return callback ( err ) ;
247
247
var query = { _id : id } ;
248
- var projection = getProjection ( fields ) ;
248
+ var projection = getProjection ( fields , options ) ;
249
249
collection . find ( query ) . limit ( 1 ) . project ( projection ) . next ( function ( err , doc ) {
250
250
if ( err ) return callback ( err ) ;
251
251
var snapshot = ( doc ) ? castToSnapshot ( doc ) : new MongoSnapshot ( id , 0 , null , undefined ) ;
@@ -258,7 +258,7 @@ ShareDbMongo.prototype.getSnapshotBulk = function(collectionName, ids, fields, o
258
258
this . getCollection ( collectionName , function ( err , collection ) {
259
259
if ( err ) return callback ( err ) ;
260
260
var query = { _id : { $in : ids } } ;
261
- var projection = getProjection ( fields ) ;
261
+ var projection = getProjection ( fields , options ) ;
262
262
collection . find ( query ) . project ( projection ) . toArray ( function ( err , docs ) {
263
263
if ( err ) return callback ( err ) ;
264
264
var snapshotMap = { } ;
@@ -335,7 +335,7 @@ ShareDbMongo.prototype.getOpsToSnapshot = function(collectionName, id, from, sna
335
335
var err = getSnapshotOpLinkErorr ( collectionName , id ) ;
336
336
return callback ( err ) ;
337
337
}
338
- this . _getOps ( collectionName , id , from , function ( err , ops ) {
338
+ this . _getOps ( collectionName , id , from , options , function ( err , ops ) {
339
339
if ( err ) return callback ( err ) ;
340
340
var filtered = getLinkedOps ( ops , null , snapshot . _opLink ) ;
341
341
var err = checkOpsFrom ( collectionName , id , filtered , from ) ;
@@ -355,7 +355,7 @@ ShareDbMongo.prototype.getOps = function(collectionName, id, from, to, options,
355
355
var err = doc && checkDocHasOp ( collectionName , id , doc ) ;
356
356
if ( err ) return callback ( err ) ;
357
357
}
358
- self . _getOps ( collectionName , id , from , function ( err , ops ) {
358
+ self . _getOps ( collectionName , id , from , options , function ( err , ops ) {
359
359
if ( err ) return callback ( err ) ;
360
360
var filtered = filterOps ( ops , doc , to ) ;
361
361
var err = checkOpsFrom ( collectionName , id , filtered , from ) ;
@@ -394,7 +394,7 @@ ShareDbMongo.prototype.getOpsBulk = function(collectionName, fromMap, toMap, opt
394
394
// requested versions
395
395
if ( ! conditions . length ) return callback ( null , opsMap ) ;
396
396
// Otherwise, get all of the ops that are newer
397
- self . _getOpsBulk ( collectionName , conditions , function ( err , opsBulk ) {
397
+ self . _getOpsBulk ( collectionName , conditions , options , function ( err , opsBulk ) {
398
398
if ( err ) return callback ( err ) ;
399
399
for ( var i = 0 ; i < conditions . length ; i ++ ) {
400
400
var id = conditions [ i ] . d ;
@@ -546,26 +546,26 @@ function getOpsQuery(id, from) {
546
546
{ d : id , v : { $gte : from } } ;
547
547
}
548
548
549
- ShareDbMongo . prototype . _getOps = function ( collectionName , id , from , callback ) {
549
+ ShareDbMongo . prototype . _getOps = function ( collectionName , id , from , options , callback ) {
550
550
this . getOpCollection ( collectionName , function ( err , opCollection ) {
551
551
if ( err ) return callback ( err ) ;
552
552
var query = getOpsQuery ( id , from ) ;
553
553
// Exclude the `d` field, which is only for use internal to livedb-mongo.
554
554
// Also exclude the `m` field, which can be used to store metadata on ops
555
555
// for tracking purposes
556
- var projection = { d : 0 , m : 0 } ;
556
+ var projection = ( options && options . metadata ) ? { d : 0 } : { d : 0 , m : 0 } ;
557
557
var sort = { v : 1 } ;
558
558
opCollection . find ( query ) . project ( projection ) . sort ( sort ) . toArray ( callback ) ;
559
559
} ) ;
560
560
} ;
561
561
562
- ShareDbMongo . prototype . _getOpsBulk = function ( collectionName , conditions , callback ) {
562
+ ShareDbMongo . prototype . _getOpsBulk = function ( collectionName , conditions , options , callback ) {
563
563
this . getOpCollection ( collectionName , function ( err , opCollection ) {
564
564
if ( err ) return callback ( err ) ;
565
565
var query = { $or : conditions } ;
566
566
// Exclude the `m` field, which can be used to store metadata on ops for
567
567
// tracking purposes
568
- var projection = { m : 0 } ;
568
+ var projection = ( options && options . metadata ) ? null : { m : 0 } ;
569
569
var stream = opCollection . find ( query ) . project ( projection ) . stream ( ) ;
570
570
readOpsBulk ( stream , callback ) ;
571
571
} ) ;
@@ -681,7 +681,7 @@ ShareDbMongo.prototype.query = function(collectionName, inputQuery, fields, opti
681
681
var self = this ;
682
682
this . getCollection ( collectionName , function ( err , collection ) {
683
683
if ( err ) return callback ( err ) ;
684
- var projection = getProjection ( fields ) ;
684
+ var projection = getProjection ( fields , options ) ;
685
685
self . _query ( collection , inputQuery , projection , function ( err , results , extra ) {
686
686
if ( err ) return callback ( err ) ;
687
687
var snapshots = [ ] ;
@@ -1231,10 +1231,12 @@ function isPlainObject(value) {
1231
1231
// depends on the data being stored at the top level of the document. It will
1232
1232
// only work properly for json documents--which are the only types for which
1233
1233
// we really want projections.
1234
- function getProjection ( fields ) {
1234
+ function getProjection ( fields , options ) {
1235
1235
// When there is no projection specified, still exclude returning the
1236
1236
// metadata that is added to a doc for querying or auditing
1237
- if ( ! fields ) return { _m : 0 , _o : 0 } ;
1237
+ if ( ! fields ) {
1238
+ return ( options && options . metadata ) ? { _o : 0 } : { _m : 0 , _o : 0 } ;
1239
+ }
1238
1240
// Do not project when called by ShareDB submit
1239
1241
if ( fields . $submit ) return ;
1240
1242
@@ -1244,6 +1246,7 @@ function getProjection(fields) {
1244
1246
}
1245
1247
projection . _type = 1 ;
1246
1248
projection . _v = 1 ;
1249
+ if ( options && options . metadata ) projection . _m = 1 ;
1247
1250
return projection ;
1248
1251
}
1249
1252
0 commit comments