如何使用Node.JS将$ inc运算符用于MongoDB中的变量

时间:2019-06-07 02:03:27

标签: node.js mongodb

我正在尝试使用我网站的Node.JS后端在mongoDb中构建“访问者数量”集合。前端将以下信息作为JSON发送到Node.JS后端。

  1. isUniqueVisitor-如果是,则为1,否则,则为0
  2. 国家/地区-标准国家/地区代码-“ JP”,“ IN”,“ UK”等

我的数据库如下

{
    "today": 2019-06-07,
    "uniqueVisitors": {
        "count": 230,
        "countries": {
            "JP": 102,
            "IN": 88,
            "UK": 30
        }
    }
}

如果我使用固定值的$ inc,效果很好

Eg. $inc: {count: 1}  // for string/integers keys
Eg. $inc: {"uniqueVisitors.count": 1} // inside quotes to access key of a JSON

主要问题: 我无法使用变量访问文档名称。

Eg. $inc: {`uniqueVisitors.countries[${req.body.country}]`}

这会产生错误,因为反引号不能用于Mongo。 我尝试过

Eg. $inc: {uniqueVisitors["countries"][req.body.country]}

但是即使这样也会造成错误。

我在网上跟踪发现,可以通过将所需的JSON直接传递给$ set来实现使用变量的mongo $ set。因此,我采用以下方式对其进行编码。

 mongoClient.connect(mongoURL, async function (err, db) {
        if (err) throw err;
        console.log("Database connected");

            // Identifying my document with today's date
            var myQuery = {
                date: getTodayDate()
            };

            // Defining the JSON to be passed to uniqueVisitors $inc
            var uniqueVisitorsInc = {
                "uniqueVisitors": {
                    "count": 0,
                    "countries": {}
                }
            };

            // Populating the JSON to be passed to uniqueVisitors $inc => essentially asking to increase count by 1 and increase that country's count by 1

            uniqueVisitorsInc["uniqueVisitors"]["count"] = 1;
            uniqueVisitorsInc["uniqueVisitors"]["countries"][myData.country] = 1;

            var newValues = {
                $inc: uniqueVisitorsInc
            };
            await db.collection("visitorStats").update(myQuery, newValues, {upsert: true});
            db.close();
    });
  

上述方法在编辑器上效果很好,但引发了以下运行时错误:

$inc requires numerical values

基本上要求我以{var1:1,var2:5}模式将值传递给$ inc。

请帮助我绕过这种奇怪的情况。

我知道我可以执行两步过程,首先读取值,在变量中递增,然后在Mongo中$ set。

但是,有人知道如何使用$ inc克服这种情况吗?

1 个答案:

答案 0 :(得分:1)

如果此更新仅被硬编码为仅更新“ JP”,则其外观应为:

$inc: { "uniqueVisitors.country.JP": 1 }

因此,您几乎可以使用backtick方法,但需要稍微更改语法并像这样保留: 1部分:

$inc: { [`uniqueVisitors.country.${req.body.country}`]: 1 }