С рамката за агрегиране може да изглежда така
db.getCollection('yourCollection').aggregate([
{
$unwind: '$arr'
},
{
$match: {
$or: [
{ 'arr.name': /world/i },
{ 'arr.description': /world/i }
]
}
},
{
$project: {
_id: '$arr._id',
name: '$arr.name',
description: '$arr.description'
}
}
])
което ще доведе до следния изход за вашите примерни данни:
{
"_id" : 1,
"name" : "Random",
"description" : "Hello world"
}
{
"_id" : 2,
"name" : "World",
"description" : "This is a random description"
}
Ако имате нужда от единичен масив с получените документи, както е показано във вашия въпрос, можете просто да ланцуговате toArray()
извикване в края на конвейера - имайте предвид обаче, че това може да доведе до увеличено потребление на памет в случай на големи набори от резултати, както е посочено от SSDMS
в коментарите.