【问题标题】:MongoDB : aggregation framework : $match between fieldsMongoDB:聚合框架:字段之间的 $match
【发布时间】:2013-01-24 12:24:30
【问题描述】:

我有一个包含两个文档的测试集合:

> db.test.find().pretty()
{ "_id" : ObjectId("510114b46c1a3a0f6e5dd7aa"), "a" : 1, "b" : 2 }
{ "_id" : ObjectId("510114c86c1a3a0f6e5dd7ab"), "a" : 3, "b" : 1 }

使用聚合框架,我只想获取 a 大于 b 的文档。 $gt 只获取参数而不是字段中的值...

> db.test.aggregate([{"$match":{"$a":{"$gt":"$b"}}}])
{ "result" : [ ], "ok" : 1 } /* don't work*/

你有什么想法吗?

提前致谢

最好的问候

【问题讨论】:

  • 您的聚合查询似乎出错了。您希望匹配的字段应指定为a,而不是$a,即db.test.aggregate([{"$match":{"a":{"$gt":"$b"}}}])
  • @QuolonelQuestions,这仍然行不通,MongoDB 不会使用字段b 的值,它将使用$b 作为比较的右侧。这可以通过执行db.test.aggregate([{"$match":{"a":{"$eq":"$a"}}}]) 来测试。将返回零个结果。
  • 在3.6的正则查询中可以使用聚合表达式。像db.test.find( {"$expr": {"$gt": ["$a", "$b"]}}) 和聚合通过db.test.aggregate( {"$match":{"$expr": {"$gt": ["$a", "$b"]}}})

标签: mongodb aggregation-framework


【解决方案1】:

嗯,我没有太多测试,我会说你可以使用$cmp

http://docs.mongodb.org/manual/reference/aggregation/cmp/#_S_cmp

db.test.aggregate([
    {$project: {
        // All your other fields here
        cmp_value: {$cmp: ['$a', '$b']}
    }},
    {$match: {cmp_value: {$gt: 0}}} 
])

可能有更好的方法,但我附近没有安装 MongoDB 来测试。

【讨论】:

  • 我可以知道如何使用上述 php 语言的 mongdb 查询。我用上面的方法不行。请对此提供帮助。
  • @shankarmsr 使用新驱动程序:(new \MongoDB\Client())->db->collection->aggregate([['$project' => ['cmp_value' => ['$cmp' => ['$a', '$b']]]], ['$match' => ['cmp_value' => ['$gt' => 0]]]]) 或类似的东西
  • 让我看看你的答案。希望它能正常工作
【解决方案2】:

使用$expr 运算符。

在 3.6 版中引入,$expr 可以构建查询表达式来比较同一文档中的字段。

比较单个文档中的两个字段(直接取自 MongoDB Docs 的示例):

考虑包含以下文档的每月预算集合:

{ "_id" : 1, "category" : "food", "budget": 400, "spent": 450 }
{ "_id" : 2, "category" : "drinks", "budget": 100, "spent": 150 }
{ "_id" : 3, "category" : "clothes", "budget": 100, "spent": 50 }
{ "_id" : 4, "category" : "misc", "budget": 500, "spent": 300 }
{ "_id" : 5, "category" : "travel", "budget": 200, "spent": 650 }

以下操作使用$expr查找支出金额超出预算的文档:

db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )

该操作返回以下结果:

{ "_id" : 1, "category" : "food", "budget" : 400, "spent" : 450 }
{ "_id" : 2, "category" : "drinks", "budget" : 100, "spent" : 150 }
{ "_id" : 5, "category" : "travel", "budget" : 200, "spent" : 650 }

【讨论】:

    猜你喜欢
    • 2013-07-23
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多