【问题标题】:mongoDB - count the occurrence of a string in recordsmongoDB - 计算记录中字符串的出现次数
【发布时间】:2018-05-29 23:42:16
【问题描述】:

我是 MEAN 堆栈的新手。从我的一个 API 中,我设法得到以下 JSON 作为输出。

GET方法:

router.get('/', function (req, res, next) {
    var decoded = jwt.decode(req.query.token);
    User.findById(decoded.user._id, function (err, user) {
        if (err) {
            return res.status(500).json({
                title: 'An error occurred',
                error: err
            });
        }
        Treatment.find().sort('_id').limit(3)
            .exec(function (err, treatments) {
                if (err) {
                    return res.status(500).json({
                        title: 'An error occurred!',
                        error: err
                    });
                }
                res.status(200).json({
                    message: 'Success',
                    obj: treatments
                });
            });
    });
});

JSON:

{
    "message": "Success",
    "obj": [
        {
            "_id": "5a3407b5b49aa6268419755f",
            "patient": "5a3393ff963e821dc0f66598",
            "t_date": "2017-12-15T17:30:45.365Z",
            "symptoms": "fever,joint pain,headache,rash",
            "signs": "changing levels of estrogen,dryness,nail breaks",
            "review": ""
        },
        {
            "_id": "5a3407cab49aa62684197562",
            "patient": "5a3393ff963e821dc0f66598",
            "t_date": "2017-12-15T17:35:45.365Z",
            "symptoms": "fever,headache",
            "signs": "nail breaks",
            "review": ""
        }
    ]
}

问题: 我需要计算在给定日期范围内出现了多少次症状,例如我附在here 上的表格。我如何计算发生次数? (mongoDB中的症状字段类型是字符串,症状可以变化)

编辑 我在客户端没有任何列表/下拉列表。它只是一个文本框。

【问题讨论】:

  • 您在客户端有symptoms 列表吗?您可以split您的字符串然后与列表进行比较以获取计数?
  • 不,我没有清单。它只是一个文本框。客户可以输入任何内容。
  • 那么客户端可以输入的内容就不一致了。你可能想实现一些更高效的东西,并且使用 Angular 很容易

标签: mongodb mongoose mean-stack


【解决方案1】:

最后我能够通过以下查询做到这一点。我认为这将有助于其他与我有同样问题的人。

mongoDB 查询

db.treatments.aggregate([
    { $match: { t_date: { $lt: new Date() } } },
    { $project: { sym: { $split:["$symptoms",","] }}},
    { $unwind: "$sym"},
    { $group: { _id: {"symtomp" : "$sym"}, count:{ $sum:1 } } }
])

示例 mongoDB 结果

{ "_id" : { "symtomp" : "rash" }, "count" : 1 }
{ "_id" : { "symtomp" : "headache" }, "count" : 2 }
{ "_id" : { "symtomp" : "joint pain" }, "count" : 1 }
{ "_id" : { "symtomp" : "fever" }, "count" : 2 }

【讨论】:

  • 您的数据模型错误。您不应该需要聚合 + 拆分,而是需要为“症状”字段使用数组。
【解决方案2】:

您需要将症状字段作为字符串数组才能轻松完成此操作。然后,Mongodb 允许在“症状”字段列表中搜索包含特定值的所有文档。

例如

db.Treatment.find({"symptoms": "headache"}).count()

【讨论】:

  • 因为我没有任何类型的列表,我无法计算特定值
  • 我如何计算不同的symptoms?像这样的可能不是 headache 。而不是新的查询来计算它。
  • 这在很大程度上取决于预期负载。
猜你喜欢
  • 2014-04-24
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 2020-02-21
  • 2012-02-12
相关资源
最近更新 更多