MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

mongodb vérifie l'expression régulière sur les champs d'une collection dans tous les champs d'une autre collection

Il n'est pas possible de référencer le champ regex stocké dans le document dans l'opérateur regex à l'intérieur de l'expression de correspondance.

Donc, cela ne peut pas être fait du côté mongo avec la structure actuelle.

$lookup fonctionne bien avec la condition d'égalité. Donc, une alternative (similaire à ce que Nic a suggéré) serait de mettre à jour votre collection de messages pour inclure un champ supplémentaire appelé keywords (tableau de valeurs de mots-clés sur lesquels il peut être recherché) pour chaque titre.

db.users.aggregate([
   {$lookup: {
          from: "posts",
          localField: "userregex",
          foreignField: "keywords",
          as: "posts"
        }
    }
])

La requête ci-dessus fera quelque chose comme ça (fonctionne à partir de 3.4).

keywords: { $in: [ userregex.elem1, userregex.elem2, ... ] }.

À partir de la documentation

Il semble que les versions antérieures (testées sur 3.2) ne correspondent que si les tableaux ont le même ordre, les valeurs et la longueur des tableaux sont les mêmes.

Exemple d'entrée :

Utilisateurs

db.users.insertMany([
  {
    "name": "James",
    "userregex": [
      "another",
      "here"
    ]
  },
  {
    "name": "John",
    "userregex": [
      "another",
      "string"
    ]
  }
])

Messages

db.posts.insertMany([
  {
    "title": "a string here",
    "keyword": [
      "here"
    ]
  },
  {
    "title": "another string here",
    "keywords": [
      "another",
      "here"
    ]
  },
  {
    "title": "one string here",
    "keywords": [
      "string"
    ]
  }
])

Exemple de sortie :

[
  {
    "name": "James",
    "userregex": [
      "another",
      "here"
    ],
    "posts": [
      {
        "title": "another string here",
        "keywords": [
          "another",
          "here"
        ]
      },
      {
        "title": "a string here",
        "keywords": [
          "here"
        ]
      }
    ]
  },
  {
    "name": "John",
    "userregex": [
      "another",
      "string"
    ],
    "posts": [
      {
        "title": "another string here",
        "keywords": [
          "another",
          "here"
        ]
      },
      {
        "title": "one string here",
        "keywords": [
          "string"
        ]
      }
    ]
  }
]