我正在尝试使用我网站的Node.JS后端在mongoDb中构建“访问者数量”集合。前端将以下信息作为JSON发送到Node.JS后端。
我的数据库如下
{
"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克服这种情况吗?
答案 0 :(得分:1)
如果此更新仅被硬编码为仅更新“ JP”,则其外观应为:
$inc: { "uniqueVisitors.country.JP": 1 }
因此,您几乎可以使用backtick方法,但需要稍微更改语法并像这样保留: 1
部分:
$inc: { [`uniqueVisitors.country.${req.body.country}`]: 1 }