Как присоединиться, а затем выполнить запрос на мангусте - PullRequest
1 голос
/ 27 мая 2020

Предположим, у меня есть 2 схемы

// User
{
  name: { type: Types.Name, required: true, index: true }
}

// Book
{
  name: { type: Types.String, index: true },
  author: { type: Types.Relationship, ref: 'User', index: true }
}

Я хочу выполнить поисковый запрос по схеме книги с оператором OR между полем «name» и полем «author.name» (это означает, что если я ввожу «ab c "поиск, он вернет все Книги с именем, включающим" ab c "или автора Книги с именем, включающим" ab c "). Как я могу этого добиться? Я ценю любую помощь, заранее спасибо.

P / S: Если у меня есть

User Collection
_id     name
1       Foo
2       Bar
3       XYZ

Book Collection
_id     name     author
1       BookA    1
2       Foo      2
3       BookC    2
4       BookD    3

Итак, когда я ввожу поисковый ключ «Foo» для запроса в коллекции книг, он вернет:

   _id     name     author
   1       BookA    1        (because author 1 name "Foo")
   2       Foo      2

1 Ответ

1 голос
/ 27 мая 2020

Будет полезен следующий запрос:

db.Book.aggregate([
  {
    $lookup: {
      from: "User",
      localField: "author",
      foreignField: "_id",
      as: "user"
    }
  },
  {
    $unwind: {
      path: "$user",
      preserveNullAndEmptyArrays: true
    }
  },
  {
    $match: {
      $expr: {
        $or: [
          {
            $eq: [
              "$name",
              "Foo" // Replace with your search string.
            ]
          },
          {
            $eq: [
              "$user.name",
              "Foo" // Replace with your search string.
            ]
          }
        ]
      }
    }
  },
  {
    $project: {
      name: 1,
      author: 1
    }
  }
])

Примечание: Вышеупомянутый запрос написан на чистом языке Mon go, вы можете легко преобразовать его в нужный.

...