RethinkDB过滤嵌套对象

时间:2015-05-12 09:30:02

标签: json filter rethinkdb

我需要嵌套对象的过滤数据解决方案。 所以,这是我的JSON数据:

{
"create_datetime": 1431000977 ,
"creator": {
    "company": {
        "id": 0 ,
        "name": "Some name"
    } ,
    "manager": {
        "id": 0 ,
        "name": ""
    }
} ,
"finished_datetime": 1431615600 ,
"id": "00949296-cbea-4d4a-a780-7c8d918a7fd6" ,
"participants": [ ],
"status": "created" ,
"tender_categories": [
    1285
] ,
"views": [ ]
},
{
"create_datetime": 1431416740 ,
"creator": {
    "company": {
        "id": 70922233 ,
        "name": "Some company name"
    } ,
    "manager": {
        "id": 1003546168 ,
        "name": "Some manager name"
    }
} ,
"finished_datetime": 1432857600 ,
"id": "28e0936b-84e0-4ffc-9ad1-78a1d34e9033" ,
"participants": {
    "788190": {
        "creator": {
            "company": {
                "id": 788190 ,
                "name": "Company name"
            } ,
            "manager": {
                "id": 1003546168 ,
                "name": "Manager Name"
            }
        } ,
        "dt_applied": 1431416778 ,
        "viewed": false
    }
} ,
"status": "created" ,
"tender_categories": [1303] ,
"views": [788190]
}

我需要从这个JSON中选择一条记录,我们有参与者,没有查看。我写了很多代码,但只有一个工作。

r.db('test').table('tenders').filter(function(tender) {
  return tender('participants').coerceTo('array').map(function(participant) {
    return participant('viewed').eq(false)
  });
});

r.db('pm').table('b2b_tenders').map(function(tender) {
  return tender('participants').filter(function(key) {
    return tender(key)('viewed').eq(false)
  });
});

等等。帮帮忙。

1 个答案:

答案 0 :(得分:5)

任何类型的嵌套对象过滤都是完全可行的。在您的情况下,您似乎想要所有文档,其中所有参与者都将属性view设置为false。

这是一种非常长而又完整且安全的检查方式:

r.db('test').table('tenders')
  // Only get all documents with `participants` property
  .hasFields('participants')
  // Only get documents where the `participants` property is an object
  .filter(function (row) {
    return row('participants').typeOf().eq('OBJECT')
  })
  // Only get documents where all participants have a `viewed` property
  .filter(function (row) {
    return row('participants').coerceTo('array')
      .map(function (row) {
        return row(1).hasFields('viewed')
      })
      .distinct()
      .eq([true])
  })
  // Only get documents where all participants have a `viewed` property set to `true`
  .filter(function (row) {
    return row('participants').coerceTo('array')
      .map(function (row) {
         return row(1)('viewed').eq(false)
      })
      .distinct()
      .eq([true])
  })

您可以取出或更改此查询的某些部分以满足您的需求,具体取决于您对即将进入的文档的了解程度。但是,此查询显示了如何处理嵌套属性。