Как обновить и вытащить пользователей, используя mongodb и узел js - PullRequest
0 голосов
/ 03 июня 2019

Я хочу обновить и вытащить пользователей из массива, используя Mongodb.

Я успешно обновляю пользователей в массиве и проверяю длину пользователей.

Если число пользователей больше или равно 2, я хочу нарезать первых 2 пользователей и удалить первых 2 пользователей из массива, используя метод pull.

пример подключения к незнакомому чату (подключение двух пользователей при нажатии кнопки connectstranger)

var userName = req.body.userName
connection.connectedusers.updateMany({}, { $push: { connectArray: [userName] } }, { upsert: true }, function (err, docs) {
  if (err) {
    console.log(err);
  } else {
    connection.connectedusers.find({}, async (err, list) => {
      if (err) {
        console.log(err);
      }
      else {
        setTimeout(async () => {
          if (list[0].connectArray.length >= 2) {
            clearTimeout();
            var shortListed = list[0].connectArray.slice(0, 2);
            console.log(shortListed,'shortlisted array')
            try {
              await connection.connectedusers.update({},
                { $pull: { connectArray: { $in: shortListed } } },
                { multi: true }
              )
              const docs = await connection.connectedusers.find({});
              res.json({ 
                message: 'users selected successfully',
                status: 1,
                docs: docs
              });
            } catch (err) {
              res.status(201).json(err);
            }
          } else {
            const docs = await connection.connectedusers.find({});
            console.log(docs, 'docs')
            const allUsers = docs.connectArray;
            console.log(allUsers, 'allUsers')
            await connection.connectedusers.update({},
              { $pull: { connectArray: { $in: allUsers } } },
              { multi: true }
            )
            res.json({
              message: 'users not selected',
              status: 2,
              docs: docs,
              allUsers: allUsers
            })
          }
        }, 10000);
      }
    });
  }
})

Первый пост-запрос возвращает status 2 error : users not selected, поэтому я хочу подождать некоторое время. Как только счетчик массивов увеличится до 2, мне нужно нарезать его и извлечь выбранных пользователей из массива.

1 Ответ

0 голосов
/ 20 июня 2019

Это будет ждать 2 секунды, используя await and promise комбо

let userName = req.body.userName
//wait till query result
let docs = await connection.connectedusers.updateMany({}, { $push: { connectArray: [userName] } }, { upsert: true });
//wait till query result
let list = await connection.connectedusers.find({});

//this will wait for 10 secs
await new Promise((resolve, reject) => {
    setTimeout(async () => {
     resolve(1);
    }, 10000);
});

//then process result
if (list[0].connectArray.length >= 2) {
    let shortListed = list[0].connectArray.slice(0, 2);
console.log(shortListed,'shortlisted array')
try {
    await connection.connectedusers.update({},
    { $pull: { connectArray: { $in: shortListed } } },
    { multi: true }
    );
    const docs = await connection.connectedusers.find({});
    res.json({ 
        message: 'users selected successfully',
        status: 1,
        docs: docs
    });
} catch (err) {
    res.status(201).json(err);
}
  } else {
    const docs = await connection.connectedusers.find({});
    console.log(docs, 'docs')
    const allUsers = docs.connectArray;
    console.log(allUsers, 'allUsers')
    await connection.connectedusers.update({},
      { $pull: { connectArray: { $in: allUsers } } },
      { multi: true }
    )
    res.json({
      message: 'users not selected',
      status: 2,
      docs: docs,
      allUsers: allUsers
    })
  }
...