Support nested queries for arrays

Enhance the built-in memory connector to correctly support nested
queries for arrays in addition to objects.

E.g. if "friends" is an array of objects containing "name", then
{ where: { "friends.name": "Jane" } } should match records containing
a friend called "Jane".
This commit is contained in:
pponugo 2016-08-04 16:37:28 -05:00 committed by Miroslav Bajtoš
parent 19dae302a2
commit a39c0236bb
2 changed files with 25 additions and 2 deletions

View File

@ -523,11 +523,15 @@ function applyFilter(filter) {
// then, we attempt to emulate mongo db matching. Helps for embedded relations // then, we attempt to emulate mongo db matching. Helps for embedded relations
var dotIndex = key.indexOf('.'); var dotIndex = key.indexOf('.');
var subValue = obj[key.substring(0, dotIndex)]; var subValue = obj[key.substring(0, dotIndex)];
if (dotIndex !== -1 && Array.isArray(subValue)) { if (dotIndex !== -1) {
var subFilter = {where: {}}; var subFilter = {where: {}};
var subKey = key.substring(dotIndex + 1); var subKey = key.substring(dotIndex + 1);
subFilter.where[subKey] = where[key]; subFilter.where[subKey] = where[key];
return subValue.some(applyFilter(subFilter)); if (Array.isArray(subValue)) {
return subValue.some(applyFilter(subFilter));
} else if (typeof subValue === 'object' && subValue !== null) {
return applyFilter(subFilter)(subValue);
}
} }
return false; return false;

View File

@ -158,6 +158,11 @@ describe('Memory connector', function() {
city: String, city: String,
state: String, state: String,
zipCode: String, zipCode: String,
tags: [
{
tag: String,
},
],
}, },
friends: [ friends: [
{ {
@ -542,6 +547,16 @@ describe('Memory connector', function() {
}); });
}); });
it('should support multi-level nested array property in query', function(done) {
User.find({where: {'address.tags.tag': 'business'}}, function(err, users) {
should.not.exist(err);
users.length.should.be.equal(1);
users[0].address.tags[0].tag.should.be.equal('business');
users[0].address.tags[1].tag.should.be.equal('rent');
done();
});
});
function seed(done) { function seed(done) {
var beatles = [ var beatles = [
{ {
@ -556,6 +571,10 @@ describe('Memory connector', function() {
city: 'San Jose', city: 'San Jose',
state: 'CA', state: 'CA',
zipCode: '95131', zipCode: '95131',
tags: [
{tag: 'business'},
{tag: 'rent'},
],
}, },
friends: [ friends: [
{name: 'Paul McCartney'}, {name: 'Paul McCartney'},