MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

mongodb überprüft Regex für Felder aus einer Sammlung auf alle Felder in einer anderen Sammlung

Es ist nicht möglich, das im Dokument gespeicherte Regex-Feld im Regex-Operator innerhalb des Übereinstimmungsausdrucks zu referenzieren.

Es kann also nicht auf der Mongo-Seite mit der aktuellen Struktur durchgeführt werden.

$lookup funktioniert gut mit Gleichheitsbedingung. Eine Alternative ( ähnlich dem Vorschlag von Nic ) wäre also, Ihre Beitragssammlung so zu aktualisieren, dass sie ein zusätzliches Feld namens keywords enthält (Array von Schlüsselwortwerten, nach denen gesucht werden kann) für jeden Titel.

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

Die obige Abfrage macht ungefähr so ​​(funktioniert ab 3.4).

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

Aus der Dokumentation

Es sieht so aus, als würden frühere Versionen (getestet auf 3.2) nur übereinstimmen, wenn Arrays die gleiche Reihenfolge, Werte und Länge der Arrays haben.

Beispieleingabe:

Benutzer

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

Beiträge

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

Beispielausgabe:

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