我不想冒险问一个重复的问题,但这可能与将变量传递给没有任何明确解决方案的MongoDB视图不同。
以下是查找IP地址16778237的国家/地区的查询。(在这个查询的范围之外,有一个公式可以将IPV4地址转换为数字。(
我想知道我们是否可以从NodeJS代码中抽象出这个查询,并创建一个视图,这样就可以从NodeJS中调用该视图。但是字段ipFrom和ipTo是索引的,以使查询能够针对集合中的数百万文档快速运行,因此我们不能将所有行返回到NodeJS并在那里进行过滤。
在MSSQL中,这可能必须是一个存储过程,而不是一个视图。只是想了解MongoDB中的可能性。我知道有些函数是用JavaScript编写的。那是我需要看的地方吗?
db['ip2Locations'].aggregate(
{
$match:
{
$and: [
{
"ipFrom": {
$lte: 16778237
}
},
{
"ipTo": {
$gte: 16778237
}
},
{
"active": true
}
],
$comment: "where 16778237 between startIPRange and stopIPRange and the row is 'Active',sort by createdDateTime, limit to the top 1 row, and return the country"
}
},
{
$sort:
{
'createdDateTime': - 1
}
},
{
$project:
{
'countryCode': 1
}
},
{
$limit: 1
}
)
第2部分-经过更多的研究和实验,我发现这是可能的,并取得了成功,但后来看到了尝试在这个查询下面发表观点。
var ipaddr = 16778237
db['ip2Locations'].aggregate(
{
$match:
{
$and: [
{
"ipFrom": {
$lte: ipaddr
}
},
{
"ipTo": {
$gte: ipaddr
}
},
{
"active": true
}
],
$comment: "where 16778237 between startIPRange and stopIPRange and the row is 'Active',sort by createdDateTime, limit to the top 1 row, and return the country"
}
},
{
$sort:
{
'createdDateTime': - 1
}
},
{
$project:
{
'countryCode': 1
}
},
{
$limit: 1
}
)
如果我试图创建一个具有";var";就像这样;
db.createView("ip2Locations_vw-lookupcountryfromip"、"ip2LLocations"[var ipaddr=16778237db['ip2位置'].agregate(
我得到错误:
[Error] SyntaxError: expected expression, got keyword 'var'
在我上面提供的链接中,我认为这家伙试图弄清楚$$用户变量是如何工作的(这里没有例子:https://docs.mongodb.com/manual/reference/aggregation-variables/)。该页面引用了$let,但从未显示两者是如何协同工作的。我在这里找到了一个例子:https://www.tutorialspoint.com/mongodb-query-to-set-user-defined-variable-into-query变量,但不是$$变量。我是
db.createView("ip2Locations_vw-lookupcountryfromip"、"ip2LLocations"[db['ip2位置'].agregate(等"ipFrom":{$lte:$$ipaddr}
我试过ipaddr、$ipaddr和$$ipaddr,它们都给出了这个错误的变体:
[Error] ReferenceError: $ipaddr is not defined
在一个完美的世界里,人们可以做这样的事情:
get['ip2Locations_vw-lookupcountryfromip'].find({$let: {'ipaddr': 16778237})
或类似的。
我知道存储在MongoDB中的Javascript是可能的(如何在MongoDB查询中使用变量?(,但我必须重新阅读;似乎有些博客对此发出了警告。
我还没有找到一个使用$$用户变量的工作示例,仍在寻找。
解释
您想从一些服务器端代码中查询视图,并将变量传递给它
上下文
我们可以使用外部变量来重新计算视图吗?采用以下管道:
var pipeline = [{ $group:{ _id:null, useless:{ $push:"$$NOW" } } }]
我们可以使用$$
传递系统变量。我们也可以定义用户变量,但用户定义的变量由以下组成:
- 采集数据
- 系统变量
此外,请尊重您的第2部分:
变量var variable="what"
将仅被计算一次。重新定义variable="whatever"
在视图中没有区别;什么";。
结论
视图只能使用系统变量或依赖于这些系统变量或集合数据的用户变量重新计算。
在你链接的帖子中添加了一个答案。