我将用mysql查询解释这个。
select * from stock where home>away
home away
1 3
2 1
1 0
4 5
我只想与mongodb进行相同的查询。但我无法做到这一点。
array('column' => array('$gt' => what should I write here?))
我需要一些帮助才能使用PHP。
答案 0 :(得分:4)
您无法直接使用MongoDB查询执行此操作。 MongoDB中的查询仅允许与静态值进行比较。但是,有一些选择。
首先,只要更新每个字段中的值,就可以存储比较结果,例如,您可以将其存储为:
home away gt
1 3 0
2 1 1
1 0 1
4 5 0
这是最简单的解决方案,还有一个额外好处,即您可以在gt
上设置索引。当然,更新值确实意味着更多的开销。进行这种预计算与非正规化非常相似。为了构建大部分系统,在NoSQL数据库中经常需要进行非规范化。
还有一种替代方案,但它不允许您对>
进行索引搜索。您可以通过以下方式使用聚合框架:
db.so.aggregate( [
{ $project: {
'away' : 1,
'home': 1,
'better_at_home': { $cmp: [ '$home', '$away' ] }
} },
{ $match: { 'better_at_home': { $gt: 0 } } }
] );
在第一步中,我们使用$cmp
来比较home
和away
。在第二步($match
)中,我们将过滤掉差异小于或等于0的所有文档。
汇总的答案是:
{
"result" : [
{
"_id" : ObjectId("51ee7cfb812db9ff4412f12f"),
"home" : 2,
"away" : 1,
"better_at_home" : 1
},
{
"_id" : ObjectId("51ee7cff812db9ff4412f130"),
"home" : 1,
"away" : 0,
"better_at_home" : 1
}
],
"ok" : 1
}
答案 1 :(得分:2)
可悲的是,$gt
无法比较两个字段。
为非关键时间查询做的事情是使用$where
;
> db.test.insert({home:5, away:3})
> db.test.insert({home:1, away:3})
> db.test.find({$where: 'this.home > this.away'})
{ "_id" : ObjectId("51ec576418fd21f745899945"), "home" : 5, "away" : 3 }
如果你只是在行对象中存储一个额外的“diff”字段并使用$gt:0
搜索它,那么你的表现会更好。
> db.test.insert({home:5, away:3, diff:2})
> db.test.insert({home:1, away:3, diff:-2})
> db.test.find({diff: {$gt:0}}, {_id:1,home:1,away:1})
{ "_id" : ObjectId("51ee982a6e4b3b34421de7bc"), "home" : 5, "away" : 3 }
答案 2 :(得分:1)
您不能对此使用常规查询,但是,不要担心,聚合框架可以帮助$cmp
运算符:http://docs.mongodb.org/manual/reference/aggregation/cmp/
db.collection.aggregate({$project:{c: {$cmp:['$col1','$col2']}}},{$match:{c:{$gt:0}}})
然而,据说这不是非常友好的索引,目前仅限于16美分的结果。
考虑您的编辑:
$mongo->collection->aggregate(array(
array('$project'=>
array(
'c'=>array('$cmp'=>array('$col1','$col2'))
)
),
array('$match'=>array('c'=>array('$gt'=>0)))
))