【问题标题】:RethinkDB filter on nested objectsRethinkDB 过滤嵌套对象
【发布时间】:2015-05-12 09:30:01
【问题描述】:

我需要通过嵌套对象过滤数据的解决方案。 所以,这是我的 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)
  });
});

等等。请帮忙。

【问题讨论】:

    标签: json filter rethinkdb


    【解决方案1】:

    任何类型的嵌套对象过滤都是完全可行的。在您的情况下,您似乎想要所有文档,其中所有参与者都将属性 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])
      })
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-28
      • 2013-09-01
      • 2021-01-15
      • 2013-03-20
      相关资源
      最近更新 更多