Je cherche un opérateur qui me permette de vérifier si la valeur d'un champ contient une certaine chaîne.
Quelque chose comme :
db.users.findOne({$contains:{"username":"son"}})
Est-ce possible ?
Je cherche un opérateur qui me permette de vérifier si la valeur d'un champ contient une certaine chaîne.
Quelque chose comme :
db.users.findOne({$contains:{"username":"son"}})
Est-ce possible ?
Si vous devez effectuer la recherche pour plus d'un attribut, vous pouvez utiliser la fonction $or. Par exemple
Symbol.find(
{
$or: [
{ 'symbol': { '$regex': input, '$options': 'i' } },
{ 'name': { '$regex': input, '$options': 'i' } }
]
}
).then((data) => {
console.log(data)
}).catch((err) => {
console.log(err)
})
Ici, vous basez votre recherche sur le fait que l'entrée est contenue dans l'attribut symbol ou dans l'attribut name.
Recherche sur le terrain
( '$options': 'i'
pour une recherche insensible à la casse)
db.users.aggregate([
{
$match: {
'email': { '$regex': '@gmail.com', '$options': 'i' }
}
}
]);
Recherche complète de documents
(ne fonctionne que sur les champs indexés avec un indice de texte
db.articles.aggregate([
{
$match: { $text: { $search: 'brave new world' } }
}
])
Comment ignorer les balises HTML dans une correspondance RegExp :
var text = '<p>The <b>tiger</b> (<i>Panthera tigris</i>) is the largest <a href="http://stackoverflow.com/wiki/Felidae" title="Felidae">cat</a> <a href="http://stackoverflow.com/wiki/Species" title="Species">species</a>, most recognizable for its pattern of dark vertical stripes on reddish-orange fur with a lighter underside. The species is classified in the genus <i><a href="http://stackoverflow.com/wiki/Panthera" title="Panthera">Panthera</a></i> with the <a href="http://stackoverflow.com/wiki/Lion" title="Lion">lion</a>, <a href="http://stackoverflow.com/wiki/Leopard" title="Leopard">leopard</a>, <a href="http://stackoverflow.com/wiki/Jaguar" title="Jaguar">jaguar</a>, and <a href="http://stackoverflow.com/wiki/Snow_leopard" title="Snow leopard">snow leopard</a>. It is an <a href="http://stackoverflow.com/wiki/Apex_predator" title="Apex predator">apex predator</a>, primarily preying on <a href="http://stackoverflow.com/wiki/Ungulate" title="Ungulate">ungulates</a> such as <a href="http://stackoverflow.com/wiki/Deer" title="Deer">deer</a> and <a href="http://stackoverflow.com/wiki/Bovid" class="mw-redirect" title="Bovid">bovids</a>.</p>';
var searchString = 'largest cat species';
var rx = '';
searchString.split(' ').forEach(e => {
rx += '('+e+')((?:\\s*(?:<\/?\\w[^<>]*>)?\\s*)*)';
});
rx = new RegExp(rx, 'igm');
console.log(text.match(rx));
Il est probablement très facile de transformer ce filtre en un filtre d'agrégation MongoDB.
Si le regex ne fonctionne pas dans votre solution Aggregate et que vous avez des objets imbriqués. Essayez ceci pipeline de regroupement (Si votre structure d'objet est simple, il suffit de supprimer les autres conditions de la requête ci-dessous) :
db.user.aggregate({$match:
{$and:[
{"UserObject.Personal.Status":"ACTV"},
{"UserObject.Personal.Address.Home.Type":"HME"},
{"UserObject.Personal.Address.Home.Value": /.*son.*/ }
]}}
)
Une autre façon serait d'effectuer directement une requête comme celle-ci :
db.user.findOne({"UserObject.Personal.Address.Home.Value": /.*son.*/ });
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.