Mongodb запрашивает только определенные данные в зависимости от состояния данных других коллекций - PullRequest
0 голосов
/ 04 апреля 2020

Я только начал пытаться выучить mongodb. Но у меня проблема с формированием запроса, по которому мой клиент может позвонить.

У меня есть схема профиля и схема друзей. Цель состоит в том, чтобы получить всех друзей по objectId. Но есть кое-что, что я делаю совершенно неправильно.

Схема профиля

const profileSchema = new mongoose.Schema({
    username: {type: String, required: true},
    uid: {type: String, required: true},
    level: {type: String, default: "1"},
    exp: {type: String, default: "1"},
    wins: {type: String, default: "0"},
    draws: {type: String, default: "0"},
    lost: {type: String, default: "0"},
    gems: {type: String, default: "0"},
    profilePicture: {type: String, default: "p1"},
    rating: {type: String, default: "400"},
    friends: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Friends'}]
});

Схема друзей

const friendsSchema = new mongoose.Schema({
    requester: { type: mongoose.Schema.Types.ObjectId, ref: 'Profiles'},
    recipient: { type: mongoose.Schema.Types.ObjectId, ref: 'Profiles'},
    status: {
      type: Number,
      enums: [
          0,    //'add friend',
          1,    //'requested',
          2,    //'pending',
          3,    //'friends'
      ]
    }
  }, {timestamps: true}

Агрегированный вызов mongoDb

async function getAllFriendsById(myUserObjId) {
    return await ProfileModel.aggregate([
        { "$match": { _id: myUserObjId}},
        { "$lookup": {
          "from": friendsDao.FriendsModel.collection.name,
          "let": { "friends": "$friends" },
          "pipeline": [
            { "$match": {
              "recipient": myUserObjId,
              "$expr": { "$in": [ "$_id", "$$friends" ] }
            }},
            { "$project": { "status": 1 } }
          ],
          "as": "friends"
        }},
        { "$addFields": {
          "friendsStatus": {
            "$ifNull": [ { "$min": "$friends.status" }, 0 ]
          }
        }}
    ])
}

API-вызов работает. Когда я удаляю { "$match": { _id: myUserObjId}} из запроса. Я получаю все профили, хранящиеся в БД. Что не то, что я хочу. Только пользователи, с которыми я дружу, получили запрос или имеют ожидающий запрос.

Ссылка: Моделирование для схемы друзей в пн goose? При создании я использовал следующую ссылку мои схемы и запрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...