MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

mongodb verifica regex em campos de uma coleção para todos os campos em outra coleção


Não é possível fazer referência ao campo regex armazenado no documento no operador regex dentro da expressão de correspondência.

Portanto, não pode ser feito no lado do mongo com a estrutura atual.

$lookup funciona bem com condição de igualdade. Portanto, uma alternativa (semelhante ao que Nic sugeriu) seria atualizar sua coleção de postagens para incluir um campo extra chamado keywords ( array de valores de palavras-chave em que pode ser pesquisado ) para cada título.
db.users.aggregate([
   {$lookup: {
          from: "posts",
          localField: "userregex",
          foreignField: "keywords",
          as: "posts"
        }
    }
])

A consulta acima fará algo assim (funciona a partir de 3.4).
keywords: { $in: [ userregex.elem1, userregex.elem2, ... ] }.

Dos documentos

Parece que as versões anteriores (testadas em 3.2) só corresponderão se a matriz tiver a mesma ordem, os valores e o comprimento das matrizes forem os mesmos.

Entrada de amostra:

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

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

Saída de amostra:
[
  {
    "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"
        ]
      }
    ]
  }
]