我有一个带有 ticker 字段的集合的 meteorjs 应用程序。
我需要 $where 语句,因为我想比较同一个字段中的两个字段收藏:
Tickers.find({$where: function() { return (this.price < this.value); }})
它没有用,我用 $where 做了一个更简单的测试。
在服务器端,当我运行这个查询时:
var t = Tickers.find({ticker:'AAPL'});
t 包含正确的值:一个带有“AAPL”代码值的项目。当我使用时:
t = Tickers.find({$where: function() { return (this.ticker === 'AAPL'); }});
t 包含集合中的所有项目。
相同的 $where 查询在客户端有效,但我不想发布(巨大的)集合在客户端进行查询。
最佳答案
您需要通过 $where 函数作为一个字符串,而不是一个实际的函数。这是 Mongo 处理和运行函数所必需的(在 Node.js 中未完成)。关注这个forum thread有关更多信息。
因此将您的查询更改为
Tickers.find({"$where": "function() { return (this.price < this.value); }"})
或者直接传入字符串比较
Tickers.find("this.price < this.value");
但是,请记住,由于使用了 $where,这不会很好地执行。 运算符调用 JavaScript 引擎来评估每个文档上的 Javascript 代码并检查每个文档的条件。如果可以的话,建议结合索引查询,这样查询可能会更快。
一些 considerations 使用时要注意$where :
Do not use global variables.
$whereevaluates JavaScript and cannot take advantage of indexes. Therefore, query performance improves when you express your query using the standard MongoDB operators (e.g.,$gt,$in). In general, you should use$whereonly when you can’t express your query using another operator. If you must use$where, try to include at least one other standard query operator to filter the result set. Using$wherealone requires a table scan. Using normal non-$wherequery statements provides the following performance advantages:MongoDB will evaluate non-
$wherecomponents of query before$wherestatements. If the non-$wherestatements match no documents, MongoDB will not perform any query evaluation using$where. The non-$wherequery statements may use an index.
另一个避免使用 $where 的建议 运算符将创建一个额外的计算非规范化字段,例如 price_difference,这是价格和值(value)(值(value) - 价格)之间的差异,然后您可以将其查询为:
Tickers.find({ "price_difference": { "$gt": 0 }});
但是,如果集合非常大,这种低选择性字段仍然不会产生良好的索引性能,因此使用这种方法索引的候选集很大。
关于javascript - Meteorjs 集合查找 $where,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35085468/
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
//1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json
我有一个应用需要发送用户事件邀请。当用户邀请friend(用户)参加事件时,如果尚不存在将用户连接到该事件的新记录,则会创建该记录。我的模型由用户、事件和events_user组成。classEventdefinvite(user_id,*args)user_id.eachdo|u|e=EventsUser.find_or_create_by_event_id_and_user_id(self.id,u)e.save!endendend用法Event.first.invite([1,2,3])我不认为以上是完成我的任务的最有效方法。我设想了一种方法,例如Model.find_or_cr
我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的
我想找到给定字符串中的所有匹配项,包括重叠匹配项。我怎样才能实现它?#Example"a-b-c-d".???(/\w-\w/)#=>["a-b","b-c","c-d"]expected#Solutionwithoutoverlappedresults"a-b-c-d".scan(/\w-\w/)#=>["a-b","c-d"],but"b-c"ismissing 最佳答案 在积极的前瞻中使用捕获:"a-b-c-d".scan(/(?=(\w-\w))/).flatten#=>["a-b","b-c","c-d"]参见Rubyde
我正在构建一个小部件来显示奥运会的奖牌数。我有一个“国家”对象的集合,其中每个对象都有一个“名称”属性,以及奖牌计数的“金”、“银”、“铜”。列表应该排序:1.首先是奖牌总数2.如果奖牌相同,按类型分割(金>银>铜,即2金>1金+1银)3.如果奖牌和类型相同,则按字母顺序子排序我正在用ruby做这件事,但我想语言并不重要。我确实找到了一个解决方案,但如果感觉必须有更优雅的方法来实现它。这是我做的:使用加权奖牌总数创建一个虚拟属性。因此,如果他们有2个金牌和1个银牌,加权总数将为“3.020100”。1金1银1铜为“3.010101”由于我们希望将奖牌数排序为最高的,因此列表按降序排
这应该是一个简单的问题,但我找不到任何相关信息。给定一个Ruby中的正则表达式,对于每个匹配项,我需要检索匹配的模式$1、$2,但我还需要匹配位置。我知道=~运算符为我提供了第一个匹配项的位置,而string.scan(/regex/)为我提供了所有匹配模式。如果可能,我需要在同一步骤中获得两个结果。 最佳答案 MatchDatastring.scan(regex)do$1#Patternatfirstposition$2#Patternatsecondposition$~.offset(1)#Startingandendingpo
可能真的很简单,但我很难在网上找到关于这个的文档我在Ruby中有两个activerecord查询,我想通过OR运算符连接在一起@pro=Project.where(:manager_user_id=>current_user.id)@proa=Project.where(:account_manager=>current_user.id)我是ruby的新手,但我自己尝试使用||@pro=Project.where(:manager_user_id=>current_user.id||:account_manager=>current_user.id)这没有用,所以1.我想知道如何在