MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

mongodb controlla l'espressione regolare sui campi da una raccolta a tutti i campi nell'altra raccolta

Non è possibile fare riferimento al campo regex memorizzato nel documento nell'operatore regex all'interno dell'espressione di corrispondenza.

Quindi non può essere fatto in mongo side con la struttura attuale.

$lookup funziona bene con la condizione di uguaglianza. Quindi un'alternativa (simile a quella suggerita da Nic) sarebbe aggiornare la tua raccolta di post per includere un campo aggiuntivo chiamato keywords (array di valori di parole chiave su cui è possibile cercare) per ogni titolo.

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

La query precedente farà qualcosa del genere (funziona da 3.4).

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

Dai documenti

Sembra che le versioni precedenti ( testate su 3.2 ) corrispondano solo se l'array ha lo stesso ordine, i valori e la lunghezza degli array sono gli stessi.

Esempio di input:

Utenti

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

Messaggi

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

Esempio di output:

[
  {
    "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"
        ]
      }
    ]
  }
]