Как я могу использовать поле из агрегата в регулярном выражении $ match в mongodb? - PullRequest
0 голосов
/ 18 января 2019

Очень упрощенная версия моего варианта использования - найти все сообщения, начинающиеся с имени автора, что-то вроде этого:

> db.users.find();
{ "_id" : ObjectId("5c4185be19da7e815cb18f59"), "name" : "User1" }
{ "_id" : ObjectId("5c4185be19da7e815cb18f5a"), "name" : "User2" }

db.posts.insert([
  {author : ObjectId("5c4185be19da7e815cb18f59"), text: "User1 is my name"},
  {author : ObjectId("5c4185be19da7e815cb18f5a"), text: "My name is User2, but this post doesn't start with it"}
]);

Итак, я хочу указать все сообщения, которые начинаются с имени автора. Я пытаюсь с агрегатом, как это, но я не знаю, как извлечь имя пользователя из конвейера агрегата для использования в совпадении с регулярным выражением:

db.users.aggregate([
  {
    $lookup: {
      from: "posts",
      localField: "_id",
      foreignField: "author",
      as: "post"
    }
  },
  {
    $match: { "post.text": { $regex: "^" + name}}
  }
]).pretty();

Понятие «имя» здесь не определено, мне нужно извлечь имя из записи коллекции пользователей из предыдущего шага конвейера. Почему-то я не понимаю, как это сделать.

Это, наверное, очень просто, и я определенно чувствую себя толстым как кирпич ... Любая помощь высоко ценится!

1 Ответ

0 голосов
/ 18 января 2019

Вы можете использовать ниже aggregation, используя $indexOfCP

db.users.aggregate([
  { "$lookup": {
    "from": "posts",
    "let": { "authorId": "$_id", "name": "$name" },
    "pipeline": [
      { "$match": {
        "$expr": {
          "$and": [
            { "$ne": [{ "$indexOfCP": ["$text", "$$name"] }, -1] },
            { "$eq": ["$author", "$$authorId"] }
          ]
        }
      }}
    ],
    "as": "post"
  }}
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...