Given a Mongo collection of data of the form:
// 'Entities'
{ tags: [{ a: '1', b: '1' }, { a: '2', b: '3' }] }
{ tags: [{ a: '1', b: '2' }, { a: '2', b: '3' }] }
{ tags: [{ a: '4', b: '4' }, { a: '4', b: '5' }, { a: '6', b: '7' }] }
I’d like to find all documents whose ‘tag’ entry has any of the following objects:
[{ a: '1', b: '1' }, { a: '4', b: '4' }]
With the example data, this would match the first and third elements:
{ tags: [{ a: '1', b: '1' }, { a: '2', b: '3' }] }
{ tags: [{ a: '4', b: '4' }, { a: '4', b: '5' }, { a: '6', b: '7' }] }
At the moment I’m doing it with a generated query (JS):
entities.find({
$or: tags.map(tag => ({
tags: { $elemMatch: tag },
})
})
But this seems very inefficient, as if the number of tags I’m searching for is large I’ll be essentially running hundreds of separate queries. Is there a better way?
2
Answers
Perhaps nest the
$or
.(I’m uncertain the shape of your data, but apparently
tags
is a property ofapprovers
?)mongoplayground
It looks like you could just use the
$in
operator instead, This should give better performance ( and cleaner code ) on large scale.Mongo Playground