我基本上尝试做的是根据用户是否属于该组而在前端(react.js)上呈现不同的外观。我尝试了条件查询,在前端循环等。
解决这个问题的方法是什么?
我的最后一次尝试是聚合,但它没有返回任何值:
Role.aggregate(
[
{
$project: {_id: roleID,
UserInRole: { $cond: {
if:{ userList: { $in: [userID]}}, then: true, else: false} }}
}
]
)
答案 0 :(得分:1)
要想出一个正常运行的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>"
},
....
]
}
您的群组文档/对象可以具有类似名称,创建日期,描述等属性的属性。其中一个属性应该是&#34; group_members&#34;这可以在进行查询时使用,以查看用户(基于id)是否属于特定组。
MongoDB $elemMatch
运算符似乎是满足您的用例的一个很好的选择(如果您使用类似的组数据结构到示例一。进一步说明$ elemMatch页面上的一个部分是{ {3}}。您可以执行以下查询:
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中使用它,您可以将Array of Embedded Documents与MongoDB NodeJS Driver网络服务器结合使用:
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');
});
启动并运行后,您可以转到网址Express,它应该返回true或false,具体取决于是否有一个ID为594ea5bc4be3b65eeb8705d8的组和该组中ID为12345的用户。
在您的前端代码中,当登录用户访问组页面时,请向该URL发出请求,并相应地替换组ID和用户ID。您获得的响应将决定是否显示&#34;加入&#34;或&#34;离开&#34;按钮。