我需要嵌套对象的过滤数据解决方案。 所以,这是我的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)
});
});
等等。帮帮忙。
答案 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])
})
您可以取出或更改此查询的某些部分以满足您的需求,具体取决于您对即将进入的文档的了解程度。但是,此查询显示了如何处理嵌套属性。