如何使用 mongodb 和 node js 更新和拉取用户

Posted

技术标签:

【中文标题】如何使用 mongodb 和 node js 更新和拉取用户【英文标题】:How to update and pull users using mongodb and node js 【发布时间】:2019-10-18 18:36:39 【问题描述】:

我想使用 Mongodb 从数组中更新和拉取用户。

我正在成功更新数组中的用户并检查用户的长度。

如果用户数大于等于 2,我想对前 2 个用户进行切片,并使用 pull 方法从数组中移除前 2 个用户。

陌生人聊天连接示例(当两个用户按下连接陌生人按钮时连接他们)

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);
      
    );
  
)

第一个post请求返回status 2 error : users not selected,所以想等一段时间。一旦数组计数增加到 2,我需要对其进行切片并从数组中提取选定的用户。

【问题讨论】:

用 Promises 代替 async await 怎么样? 我不知道如何使用承诺。这就是我使用异步等待的原因.. 你能分享一个用户在你的数据库中的样子吗? 您在更新后和setTimeout 之前立即进行集合查找。如果你想以这种方式组织事物,则需要在设置超时后查找以确保文档在窗口中 我知道这不是你问的,但如果我是你,我可能会研究网络套接字以及其他人如何构建聊天应用程序。这对我来说似乎不是正确的做事方式 【参考方案1】:

这将使用await and promise 组合等待 2 秒

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
    )
  

【讨论】:

let sleep = require('util').promisify(setTimeout); 后跟 await sleep(10000) 更简洁,更适合 async/await 模式。

以上是关于如何使用 mongodb 和 node js 更新和拉取用户的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Node.js 在 MongoDB 中使用 cursor.forEach()?

如何更新嵌套数组MongoDb Node js中的必填字段[重复]

错误状态:使用 Node.js (express)、Angular 和 MongoDB 的 PUT 请求返回 404

在 Mongoose (mongodb node.js) 中,如何更新现有值并插入缺失值,而不删除未指定的值?

如何更新 Node.js 中的一对多关系?

无法使用 Node.js Express MongoDB Mongoose CoffeeScript 发布