繁体   English   中英

MongoDB(比第二列更大的第一列?)(php)

[英]MongoDB (First Column bigger than Second Column?)(php)

我将用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。

您无法直接使用MongoDB查询执行此操作。 MongoDB中的查询仅允许与静态值进行比较。 但是,有一些选择。

首先,只要更新每个字段中的值,就可以存储比较结果,fe,您可以将其存储为:

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比较homeaway 在第二步( $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
}

遗憾的是, $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 }

您无法使用常规查询,但是,从不担心,聚合框架可以帮助$cmp运算符: http//docs.mongodb.org/manual/reference/aggregation/cmp/

db.collection.aggregate({$project:{c: {$cmp:['$col1','$col2']}}},{$match:{c:{$gt:0}}})

然而,据说它不是非常友好的索引,目前仅限于16meg的结果。

编辑

要考虑您的编辑:

$mongo->collection->aggregate(array(
    array('$project'=>
        array(
            'c'=>array('$cmp'=>array('$col1','$col2'))
        )
    ),
    array('$match'=>array('c'=>array('$gt'=>0)))
))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM