Utilisation de la requête d'agrégation :
$match
condition, mettre imbriqué$ememMatch
pour condition à 2 niveaux$reduce
pour parcourir la boucle du tableau vid, définissez le [] initial, vérifiez la condition si la chaîne est dans le tableau actuel, puis retournez le tableau actuel, sinon retournez la valeur initiale
let searchString = "adfsdfasfd";
db.collection.aggregate([
{
$match: {
vid: { $elemMatch: { $elemMatch: { $in: [searchString] } } }
}
},
{
$addFields: {
vid: {
$reduce: {
input: "$vid",
initialValue: [],
in: {
$cond: [{ $in: [searchString, "$$this"] }, "$$this", "$$value"]
}
}
}
}
}
])
Résultat :
[
{
"vid": [
"adfsdfasfd",
"this is some sample text",
"https://example.com"
]
}
]
Utilisation de la requête de recherche :
- Mettez la condition de correspondance comme ci-dessus
- pour la projection, obtenir le résultat de la correspondance mais dans le même tableau imbriqué
let searchString = "adfsdfasfd";
db.collection.find(
{ vid: { $elemMatch: { $elemMatch: { $in: [searchString] } } } }
).project({ "vid.$": 1, _id: 0 }).toArray()
Résultat :
[
{
"vid": [
[
"adfsdfasfd",
"this is some sample text",
"https://example.com"
]
]
}
]