如何使用 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