Skip to content

Commit b90ef36

Browse files
author
John Grogg
committed
Make find() create BSON ObjectIds automatically
When the `resourceConfig.idAttribute` is `_id` and the value of `id` is a valid BSON ObjectId hex string, then automatically convert the hex string into a BSON ObjectId. This will make the MongoDb findOne call successfully find objects by their BSON ObjectId.
1 parent 8fd0d43 commit b90ef36

File tree

5 files changed

+69
-12
lines changed

5 files changed

+69
-12
lines changed

Gruntfile.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ module.exports = function (grunt) {
5555
'mout/object/omit',
5656
'js-data',
5757
'js-data-schema',
58-
'mongodb'
58+
'mongodb',
59+
'bson'
5960
],
6061
module: {
6162
loaders: [

dist/js-data-mongodb.js

+22-11
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,19 @@ module.exports =
5353

5454
var MongoClient = __webpack_require__(1).MongoClient;
5555

56-
var JSData = _interopRequire(__webpack_require__(2));
56+
var ObjectID = __webpack_require__(2).ObjectID;
5757

58-
var underscore = _interopRequire(__webpack_require__(3));
58+
var JSData = _interopRequire(__webpack_require__(3));
5959

60-
var keys = _interopRequire(__webpack_require__(4));
60+
var underscore = _interopRequire(__webpack_require__(4));
6161

62-
var omit = _interopRequire(__webpack_require__(5));
62+
var keys = _interopRequire(__webpack_require__(5));
6363

64-
var map = _interopRequire(__webpack_require__(6));
64+
var omit = _interopRequire(__webpack_require__(6));
6565

66-
var isEmpty = _interopRequire(__webpack_require__(7));
66+
var map = _interopRequire(__webpack_require__(7));
67+
68+
var isEmpty = _interopRequire(__webpack_require__(8));
6769

6870
var DSUtils = JSData.DSUtils;
6971
var deepMixIn = DSUtils.deepMixIn;
@@ -246,6 +248,9 @@ module.exports =
246248
return new DSUtils.Promise(function (resolve, reject) {
247249
var params = {};
248250
params[resourceConfig.idAttribute] = id;
251+
if (resourceConfig.idAttribute === "_id" && typeof id === "string" && ObjectID.isValid(id)) {
252+
params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id);
253+
}
249254
client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, function (err, r) {
250255
if (err) {
251256
reject(err);
@@ -424,34 +429,40 @@ module.exports =
424429
/* 2 */
425430
/***/ function(module, exports, __webpack_require__) {
426431

427-
module.exports = require("js-data");
432+
module.exports = require("bson");
428433

429434
/***/ },
430435
/* 3 */
431436
/***/ function(module, exports, __webpack_require__) {
432437

433-
module.exports = require("mout/string/underscore");
438+
module.exports = require("js-data");
434439

435440
/***/ },
436441
/* 4 */
437442
/***/ function(module, exports, __webpack_require__) {
438443

439-
module.exports = require("mout/object/keys");
444+
module.exports = require("mout/string/underscore");
440445

441446
/***/ },
442447
/* 5 */
443448
/***/ function(module, exports, __webpack_require__) {
444449

445-
module.exports = require("mout/object/omit");
450+
module.exports = require("mout/object/keys");
446451

447452
/***/ },
448453
/* 6 */
449454
/***/ function(module, exports, __webpack_require__) {
450455

451-
module.exports = require("mout/array/map");
456+
module.exports = require("mout/object/omit");
452457

453458
/***/ },
454459
/* 7 */
460+
/***/ function(module, exports, __webpack_require__) {
461+
462+
module.exports = require("mout/array/map");
463+
464+
/***/ },
465+
/* 8 */
455466
/***/ function(module, exports, __webpack_require__) {
456467

457468
module.exports = require("mout/lang/isEmpty");

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"test": "grunt test"
4848
},
4949
"dependencies": {
50+
"bson": "^0.3.2",
5051
"mout": "0.11.0"
5152
},
5253
"peerDependencies": {

src/index.js

+4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { MongoClient } from 'mongodb';
2+
import { ObjectID } from 'bson';
23
import JSData from 'js-data';
34
import underscore from 'mout/string/underscore';
45
import keys from 'mout/object/keys';
@@ -179,6 +180,9 @@ class DSMongoDBAdapter {
179180
return new DSUtils.Promise((resolve, reject) => {
180181
let params = {};
181182
params[resourceConfig.idAttribute] = id;
183+
if (resourceConfig.idAttribute === '_id' && typeof id === 'string' && ObjectID.isValid(id)) {
184+
params[resourceConfig.idAttribute] = ObjectID.createFromHexString(id);
185+
}
182186
client.collection(resourceConfig.table || underscore(resourceConfig.name)).findOne(params, options, (err, r) => {
183187
if (err) {
184188
reject(err);

test/find.spec.js

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
describe('DSMongoDBAdapter#find', function () {
2+
it('should find a user by its bson ObjectId hex string', function () {
3+
var id;
4+
5+
return adapter.findAll(User, {
6+
name: 'John'
7+
}).then(function (users) {
8+
assert.equal(users.length, 0);
9+
return adapter.create(User, { name: 'John' });
10+
}).then(function (user) {
11+
id = user._id;
12+
return adapter.find(User, id.toString());
13+
}).then(function (user) {
14+
assert.deepEqual(user, { _id: id, name: 'John' });
15+
return adapter.destroy(User, id);
16+
}).then(function (destroyedUser) {
17+
assert.isFalse(!!destroyedUser);
18+
});
19+
});
20+
21+
it('should not convert id if it is not a valid bson ObjectId hex string', function() {
22+
var id;
23+
24+
return adapter.findAll(User, {
25+
name: 'John'
26+
}).then(function (users) {
27+
assert.equal(users.length, 0);
28+
return adapter.create(User, { _id: 1, name: 'John' });
29+
}).then(function (user) {
30+
id = user._id;
31+
assert.equal(typeof id, 'number');
32+
return adapter.find(User, id);
33+
}).then(function (user) {
34+
assert.deepEqual(user, { _id: id, name: 'John' });
35+
return adapter.destroy(User, id);
36+
}).then(function (destroyedUser) {
37+
assert.isFalse(!!destroyedUser);
38+
});
39+
});
40+
});

0 commit comments

Comments
 (0)