要提出一个有效的 MongoDB 查询来确定用户是否属于某个组,需要了解您如何构建数据库和组集合。一种这样的结构方式:
{
"_id" : ObjectId("594ea5bc4be3b65eeb8705d8"),
"group_name": "...",
"group_members": [
{
"user_id": ObjectId("<same one from users collection"),
"user_name": "Alice",
"user_profile_picture": "<link_to_imag_url>"
},
{
"user_id": ObjectId("<same one from users collection"),
"user_name": "Bob",
"user_profile_picture": "<link_to_imag_url>"
},
....
]
}
您的组文档/对象可以具有名称、创建日期、描述等属性。其中一个属性应该是“group_members”,可以在查询时使用它来查看用户(基于 id ) 是特定组的一部分。
MongoDB $elemMatch 运算符似乎是满足您的用例的绝佳选择(如果您使用与示例类似的组数据结构。在 $elemMatch 页面的下方是Array of Embedded Documents 的部分。您可以进行如下查询:
db.groups.find({
_id: ObjectId("<id of group you're checking"),
group_members: {
$elemMatch: { user_id: ObjectId("<user id of user you're checking>") }
}
})
这将返回 1 或 0 个结果。 1 如果有一个组具有该 _id 和一个 group_members 数组,其中包含一个具有指定用户 ID 的元素,否则为 0。
现在要在 Node 中使用它,您可以将 MongoDB NodeJS Driver 与 Express 网络服务器结合使用:
var MongoClient = require('mongodb').MongoClient
var ObjectID = require('mongodb').ObjectID;
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
// Connection URL
var url = 'mongodb://localhost:27017/test'; // change test to whichever db you added the collections to
app.get('/partOfGroup', (req, res) => {
if (req.query.groupId == null || req.query.userId == null) {
return res.send('Must include both groupId and userId')
} else {
MongoClient.connect(url, function(err, db) {
var collection = db.collection('groups');
collection.findOne({
_id: ObjectID(req.query.groupId),
group_members: {
$elemMatch: { user_id: req.query.userId}
}
}, function(err, result) {
return res.send(result != null)
})
})
}
});
app.listen(3000, function () {
console.log('Example app listening on port 3000');
});
启动并运行后,您可以转到 URL http://localhost:3000/partOfGroup?groupId=594ea5bc4be3b65eeb8705d8&userId=12345,它应该返回 true 或 false,具体取决于该组中是否有 ID 为 594ea5bc4be3b65eeb8705d8 的组和 ID 为 12345 的用户。
当登录用户访问群组页面时,从您的前端代码向该 URL 发出请求,适当地替换群组 ID 和用户 ID。您得到的响应将决定是显示“加入”还是“离开”按钮。