Использование $ match во встроенном документе в совокупности - PullRequest
0 голосов
/ 10 апреля 2019

Я пытаюсь использовать $ match, чтобы найти элементы с определенным _id в двойном внедренном документе.

У меня есть документ с именем users, который содержит такую ​​информацию, как имя, адрес электронной почты, а также содержит встроенный документ.документ, с которым связан бизнес, с которым работает этот пользователь.

У меня также есть документ, называемый бизнесом, который содержит встроенный документ, в котором находится здание, в котором находится этот бизнес.

У меня также есть документназывается здание.

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

У меня есть агрегатная функция, которая использует $ lookup, чтобы соответствоватьпользователи здания, в котором они находятся. и это работает.Однако теперь я пытаюсь использовать $ match, чтобы вернуть только документы с определенным идентификатором здания.

Вот пример моих пользовательских, деловых и строительных документов:

_id: 5ca487c0eeedbe8ab59d7a7a
name: "John Smith"
email: "jsmith9@gmail.com"
business: Object
  _id: 5ca48481eeedbe8ab59d7a38
  name: "Visitors"


_id: 5ca48481eeedbe8ab59d7a38
name: "Visitors"
building: Object
  _id: 5ca48481eeedbe8ab59d7a36
  name: "Building1"


_id: 5ca48481eeedbe8ab59d7a36
name: "Building1"

Когда явернуть агрегированный запрос, он возвращает документы в следующем формате:

    {
        "_id": "5ca487c0eeedbe8ab59d7a7a",
        "name": "John Smith",
        "email": "jsmith9@gmail.com",
        "business": {
            "_id": "5ca48481eeedbe8ab59d7a38",
            "name": "Visitors"
        },
        "__v": 0,
        "user_building": {
            "_id": "5ca48481eeedbe8ab59d7a38",
            "name": "Visitors",
            "building": {
                "_id": "5ca48481eeedbe8ab59d7a36",
                "name": "Building1"
            },
            "__v": 0
        }
    },

Однако, когда я добавляю совпадение, он возвращает [].Что я здесь не так делаю?

router.get("/:id", async (req, res) => {
  const users_buildings = await User.aggregate([
    {
      $lookup: {
        from: "businesses",
        localField: "business._id",
        foreignField: "_id",
        as: "user_building"
      }
    },
    { $unwind: "$user_building" },

    {
      $match: {
        "user_building.building": { _id: req.params.id }
      }
    }
  ]);

1 Ответ

1 голос
/ 10 апреля 2019

Вы должны соответствовать _id внутри строительного объекта. Попробуйте с этим

 {
  $match: {
    "user_building.building._id": req.params.id
  }
}

если не работает

{
  $match: {
    "user_building.building._id": ObjectId(req.params.id)
  }
}

op edit: я импортировал ObjectId с:

var ObjectId = require('mongodb').ObjectID;

и использовал второе решение, и оно работало правильно.

...