Make find() in MongoStorageAdapter

This commit is contained in:
Drew Gross
2016-05-21 19:51:06 -07:00
parent 3a96140103
commit 69d5a2f87c

View File

@@ -1,5 +1,6 @@
let mongodb = require('mongodb');
let Collection = mongodb.Collection;
import * as transform from './MongoTransform';
export default class MongoCollection {
_mongoCollection:Collection;
@@ -13,25 +14,28 @@ export default class MongoCollection {
// none, then build the geoindex.
// This could be improved a lot but it's not clear if that's a good
// idea. Or even if this behavior is a good idea.
// Depends on the className and schemaController because mongoObjectToParseObject does.
// TODO: break this dependency
find(query, { skip, limit, sort } = {}) {
return this._rawFind(query, { skip, limit, sort })
.catch(error => {
// Check for "no geoindex" error
if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
throw error;
}
// Figure out what key needs an index
let key = error.message.match(/field=([A-Za-z_0-9]+) /)[1];
if (!key) {
throw error;
}
.catch(error => {
// Check for "no geoindex" error
if (error.code != 17007 && !error.message.match(/unable to find index for .geoNear/)) {
throw error;
}
// Figure out what key needs an index
let key = error.message.match(/field=([A-Za-z_0-9]+) /)[1];
if (!key) {
throw error;
}
var index = {};
index[key] = '2d';
return this._mongoCollection.createIndex(index)
// Retry, but just once.
.then(() => this._rawFind(query, { skip, limit, sort }));
});
var index = {};
index[key] = '2d';
return this._mongoCollection.createIndex(index)
// Retry, but just once.
.then(() => this._rawFind(query, { skip, limit, sort }));
})
}
_rawFind(query, { skip, limit, sort } = {}) {