Skip to content

Commit e5eb234

Browse files
committedJul 15, 2024
only remove object if it becomes empty because of casting
1 parent 01dd471 commit e5eb234

File tree

2 files changed

+10
-3
lines changed

2 files changed

+10
-3
lines changed
 

‎lib/cast.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -69,12 +69,15 @@ module.exports = function cast(schema, obj, options, context) {
6969
if (val[k] == null || typeof val[k] !== 'object') {
7070
throw new CastError('Object', val[k], path + '.' + k);
7171
}
72+
73+
const beforeCastKeysLength = Object.keys(val[k]).length;
7274
val[k] = cast(schema, val[k], options, context);
73-
if (Object.keys(val[k]).length === 0) {
75+
if (Object.keys(val[k]).length === 0 && beforeCastKeysLength !== 0) {
7476
val.splice(k, 1);
7577
}
7678
}
7779

80+
// delete empty: {$or: []} -> {}
7881
if (val.length === 0) {
7982
delete obj[path];
8083
}

‎test/docs/cast.test.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,16 @@ describe('Cast Tutorial', function() {
125125
});
126126
Character = mongoose.model('Character', schema);
127127

128-
const query = Character.findOne({ $or: [{ notInSchema: { $lt: 'not a number' } }], $and: [{ name: 'abc' }, { age: { $gt: 18 } }, { notInSchema: { $lt: 'not a number' } }] });
128+
const query = Character.findOne({
129+
$or: [{ notInSchema: { $lt: 'not a number' } }],
130+
$and: [{ name: 'abc' }, { age: { $gt: 18 } }, { notInSchema: { $lt: 'not a number' } }],
131+
$nor: [{}] // should be kept
132+
});
129133

130134
await query.exec();
131135
query.getFilter(); // Empty object `{}`, Mongoose removes `notInSchema`
132136
// acquit:ignore:start
133-
assert.deepEqual(query.getFilter(), { $and: [{ name: 'abc' }, { age: { $gt: 18 } }] });
137+
assert.deepEqual(query.getFilter(), { $and: [{ name: 'abc' }, { age: { $gt: 18 } }], $nor: [{}] });
134138
// acquit:ignore:end
135139
});
136140

0 commit comments

Comments
 (0)
Please sign in to comment.