无法从数据集中提取对象值进行比较或应用过滤器

问题描述

我正在尝试解决 this page 上的 Q.22。数据集是 here

Q.22 编写 MongoDB 查询以查找那些在 ISODate“2014-08-11T00:00:00Z”中获得“A”等级并获得 11 分的餐厅的餐厅 ID、名称和等级调查日期

数据格式如下:

[
  {
    "_key": "2451925","_id": "restaurants/2451925","_rev": "_buC4Kd2---","address": {
      "building": "1007","coord": [
        -73.856077,40.848447
      ],"street": "Morris Park Ave","zipcode": "10462"
    },"borough": "bronx","cuisine": "Bakery","grades": [
      {
        "date": {
          "$date": 1393804800000
        },"grade": "A","score": 2
      },{
        "date": {
          "$date": 1378857600000
        },"score": 6
      },{
        "date": {
          "$date": 1358985600000
        },"score": 10
      },{
        "date": {
          "$date": 1322006400000
        },"score": 9
      },{
        "date": {
          "$date": 1299715200000
        },"grade": "B","score": 14
      }
    ],"name": "Morris Park Bake Shop","restaurant_id": "30075445"
  },{
    "_key": "2451926","_id": "restaurants/2451926","_rev": "_buC4Kd2--A","address": {
      "building": "469","coord": [
        -73.961704,40.662942
      ],"street": "Flatbush Avenue","zipcode": "11225"
    },"borough": "brooklyn","cuisine": "Hamburgers","grades": [
      {
        "date": {
          "$date": 1419897600000
        },"score": 8
      },{
        "date": {
          "$date": 1404172800000
        },"score": 23
      },{
        "date": {
          "$date": 1367280000000
        },"score": 12
      },{
        "date": {
          "$date": 1336435200000
        },"score": 12
      }
    ],"name": "Wendy'S","restaurant_id": "30112340"
  }]

我正在尝试使用上面给定的 ISODate 过滤掉日期。我正在使用 date_timestamp 函数将上述内容转换为日期在数据中的存储方式。

我无法过滤日期,因为它们似乎包含在 {"$date":1393804800000} 中。在 g 中尝试循环表示找到的是对象而不是集合或数组。应用过滤器并检查与 date_timestamp() 的相等性将返回空数组 [],[] 等。

for r in restaurants
    for g in r.grades
       let d=date_timestamp("2014-08-11T00:00:00Z")
       return {date:g.date,target_date:d}

请帮忙,谢谢

解决方法

您必须过滤对象内的字段:

LET target_date = DATE_TIMESTAMP('2014-08-11T00:00:00Z')
FOR r IN restaurants
  FOR g IN r.grades
    FILTER g.date.$date == target_date
    RETURN {date: g.date}