查询使用MongoDB从嵌套的json返回字段

时间:2017-01-26 23:10:52

标签: json mongodb aggregation-framework

我的数据库包含以下格式的数据:

{ "_id" : ObjectId( "abcd" ),
  "coordinate" : [somevalue, somevalue],
   "value" : [ 
   { "time" : 1,
     "characteristics" : "pqrs" },
   { "time" : 10,
     "characteristics" : "pqrs" }  ] }

我想找到字段最近的坐标和一个小于或等于给定值的时间。

目前我正在使用此查询:

db.collection.aggregate({
    coordinate: {
        $geoNear: [latitude, longitude],
        $maxDistance: 10
    },
    "value.time": {
        $lte: 5
    }
})

这个回复了整个条目,但我想要的是这个领域:

{ "time" : 1, "characteristics" : "pqrs" }

甚至可以返回这个字段吗?如果有多个结果并且我只想要最接近我的value.time输入的那个怎么办?

1 个答案:

答案 0 :(得分:1)

您可以执行聚合:

  • $match指定了coordinatevalue.time
  • 的项目
  • $filter value数组删除所有内容< 5
  • $unwind value array
  • $group按最大值

查询是:

db.collection.aggregate({
    $match: {
        coordinate: {
            $geoNear: [0, 0],
            $maxDistance: 10
        },
        "value.time": {
            $lte: 5
        }
    }
}, {
    $project: {
        value: {
            $filter: {
                input: "$value",
                as: "value",
                cond: { $lte: ["$$value.time", 5] }
            }
        }
    }
}, {
    $unwind: "$value"
}, {
    $group: {
        _id: "$_id",
        time: { $max: "$value.time" },
        characteristics: { $first: "$value.characteristics" }
    }
})

示例输出:

{ "_id" : ObjectId("588a8c3080a14de2d654eb7b"), "time" : 4, "characteristics" : "pqrs" }
{ "_id" : ObjectId("588a89327fe89686fd2210b2"), "time" : 1, "characteristics" : "pqrs" }