在MongoDB(node.js)中有条件地查询数据的最佳方法是什么?

时间:2017-06-24 16:47:54

标签: node.js mongodb reactjs

我基本上尝试做的是根据用户是否属于该组而在前端(react.js)上呈现不同的外观。我尝试了条件查询,在前端循环等。

解决这个问题的方法是什么?

我的最后一次尝试是聚合,但它没有返回任何值:

      Role.aggregate(
      [
        {
          $project: {_id: roleID, 
           UserInRole: { $cond: { 
           if:{ userList: { $in: [userID]}}, then: true, else: false} }}

        }
   ]
            )

1 个答案:

答案 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如果存在具有_idgroup_members数组的组,其中包含指定了用户ID的元素,否则为0.

现在要在Node中使用它,您可以将Array of Embedded DocumentsMongoDB 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;按钮。