我需要通过嵌套对象过滤数据的解决方案。下面是我的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)
});
});还有一个。请帮帮忙。
发布于 2015-05-13 00:59:15
任何类型的嵌套对象过滤都是完全可行的。在您的示例中,您似乎想要所有文档,其中所有参与者的属性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])
})根据您对即将传入的文档的了解程度,您可能会删除或更改此查询的一部分,以满足您的需要。但是,这个查询显示了如何处理嵌套属性。
https://stackoverflow.com/questions/30186854
复制相似问题