Можно ли извлечь элементы из массива упомянутых объектов, используя mongoose? - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть 2 схемы монго, связанные друг с другом с помощью ObjectId:

var User = new Schema({
    username: {
      type:String,
      unique: true
    },
    password: { 
        type:String
    },
    verified:   {
        type: Boolean,
        default: false
    },
    lastActivity:{
      type:Date,
      default:Date.now
    }
});

И схема watitingRoom со списками всех users:

var WaitingRoom = new Schema({
    lastActivity:{
          type:Date,
          default:Date.now
    },
    clients: [{
        type : mongoose.Schema.ObjectId,
        ref: 'User'
    }],
    videocalls: [{
        type: mongoose.Schema.ObjectId,
        ref:'VideoCall'
    }]
});

Итак, я хочу «обновить» мой массив clients, потянув всех клиентов, что на lastActivity меньше, чем текущее время.Я попробовал это с помощью инструмента $pull, присутствующего в mongoose.После поиска в Google и смешивания различных примеров я попробовал что-то вроде:

WaitingRoom.findOneAndUpdate({}, { lastActivity: new Date(),
                                      $pull : {clients : {"clients.lastActivity": { $lt: new Date() }}}
                                     }, options)
    .populate("clients")
    .exec( function(error, waitingRoom) {
            if (err) { return res.status(500).send({ msg: err.message }); }

    })

, который находит уникальную комнату ожидания, обновляет поле lastActivity и пытается вытащить всех клиентов, у которых clients.lastActivity меньше текущегоdate.

(Очевидно, этот отрыванный код не работает)

Проблема в том, что я не нашел никакой документации или примера, который объясняет, можно ли извлечь элементы из упомянутого ObjectId схема с использованием вложенного условия clients.lastActivity

1 Ответ

0 голосов
/ 26 сентября 2018

Сначала необходимо найти идентификаторы из базы данных User, а затем $pull их из базы данных WaitingRoom

User.find({ lastActivity: new Date() }).then((users) => {
  const ids = []
  users.map((user) => {
    ids.push(user._id)
  })
  WaitingRoom.update({}, { $pull: { clients: ids }}, { multi: true }).then(() => {
    console.log('removed')
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...