Правильная связь с поддельным мангустом - PullRequest
0 голосов
/ 01 июля 2018

У меня есть модель

const userSchema = Schema({
  username: String
})

const invitationSchema = Schema({
  decision: String,
  user: {
    type: Schema.ObjectId,
    ref: 'User'
  }
})

const groupSchema = Schema({
  name: String,
  invitations: [{
    type: Schema.ObjectId,
    ref: 'Invitation'
  }]
})

Итак, базовая модель выглядит как

group {
  name
  invitations [
     user {
       username
     }
  ]
}

Как пользователь, я хотел бы получить все группы, на которые у меня есть приглашения

const user = getContextUser()
Group.find({
  'invitations.user': user._id
})

Но, похоже, это не сработает, я мог бы использовать группу свойств, ссылающуюся на схему Group в модели Invitation, но мне нужен подход с хорошим способом

Как получить все группы, на которые у пользователя есть приглашения

Не смотрите на это ниже, это моё фактическое представление модели в json, на всякий случай

// GROUP
{
  "_id": ObjectId("5b3901dd9a8c0e6790af4ee8"),
  "image": {
    "filename": "8547aa2a-d16c-4da7-8d51-6c9bf8038037.jpg",
    "width": 236,
    "height": 156
  },
  "geolocation": {
    "coordinates": [-152.1997, -24.7718],
    "type": "Point"
  },
  "invitations": [
    ObjectId("5b3901dd9a8c0e6790af4eea"),
    ObjectId("5b3901dd9a8c0e6790af4eeb"),
    ObjectId("5b3901dd9a8c0e6790af4eec"),
    ObjectId("5b3901dd9a8c0e6790af4eed"),
    ObjectId("5b3901dd9a8c0e6790af4eee"),
    ObjectId("5b3901dd9a8c0e6790af4eef"),
    ObjectId("5b3901dd9a8c0e6790af4ef0")
  ],
  "messages": [],
  "title": "id in magnam",
  "description": "Cupiditate doloremque sunt placeat beatae et ex rerum nisi voluptate. Aliquam hic voluptas quas iure assumenda rerum aut. Quisquam vero beatae odit aut ut quod magnam.",
  "created_at": ISODate("2018-07-01T16:31:25.237Z"),
  "created_by": ObjectId("5b3901dc9a8c0e6790af4ee1"),
  "color": "#347303",
  "require_people_decision": true,
  "is_public": true,
  "start_date": ISODate("2019-03-18T20:05:03.116Z"),
  "end_date": ISODate("2019-03-18T20:05:03.116Z"),
  "location": "25498 Berniece Prairie",
  "__v": 1
}

// INVITATION
{
  "_id": ObjectId("5b3901dd9a8c0e6790af4eea"),
  "created_at": ISODate("2018-07-01T16:31:25.348Z"),
  "have_seen": false,
  "user": ObjectId("5b3901dc9a8c0e6790af4ee0"),
  "__v": 0
}

// USER 
{
  "_id": ObjectId("5b3901dc9a8c0e6790af4ee0"),
  "avatar": {
    "filename": "d438befb-2ea3-4582-b6bf-b8dd3b9bcf66.jpeg",
    "width": 200,
    "height": 200
  },
  "phone": "5556106679",
  "password": "$2b$10$mbx9Yhj5mAKyVxwmxcumaepXYkCTiF/9VM2KJRARZkPOVN300pKc.",
  "version": 1,
  "friends": [],
  "__v": 0
}

1 Ответ

0 голосов
/ 01 июля 2018

Вы можете попробовать ниже агрегации

Group.aggregate([
  { "$lookup": {
    "from": Invitations.collection.name,
    "let": { "invitations": "$invitations" },
    "pipeline": [
      { "$match": { "$expr": { "$in": [ "$_id", "$$invitations" ] } } }
    ],
    "as": "invitations"
  }},
  { "$match": { "invitations.user": user._id } }
])

или это

Group.aggregate([
  { "$lookup": {
    "from": Invitations.collection.name,
    "let": { "invitations": "$invitations" },
    "pipeline": [
      { "$match": {
        "user": user._id,
        "$expr": { "$in": [ "$_id", "$$invitations" ] }
      }}
    ],
    "as": "invitations"
  }},
  { "$match": { "invitations.user": user._id } }
])

И последний вариант, который я считаю лучшим вариантом для начала с User collection

User.aggregate([
  { "$match": { "_id": user._id }},
  { "$lookup": {
    "from": Groups.collection.name,
    "let": { "userId": "$_id" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": [ "$created_by", "$$userId" ] }}}
    ],
    "as": "groups"
  }}
])
...