我想过滤掉带有值的字段。我已经使用RESTHeart API进行了聚合。我想知道status
是被接受还是被拒绝。
数据:
{
"body": {
"VERIFIED_MESSAGE": {
"072ade7d42d871d4fe": {
"messageId": "bcd1d991-aa63",
"create": 1486546629585,
"status": "accept", //this is what I want to know
"comment": null
}
}
}
},
{
"body": {
"VERIFIED_MESSAGE": {
"595d0a56cff27": {
"messageId": "595d0a56c",
"create": 1486566646197,
"status": "reject.all",
"comment": null
}
}
}
},
{
"body": {
"VERIFIED_MESSAGE": {
"52ffd09bf5bd541602a": {
"messageId": "1dadce1d",
"create": 1486568943752,
"status": "accept",
"comment": null
}
}
}
}
聚合:
{
"stages": [
{"$match": {
"body.VERIFIED_MESSAGE": {
"$exists": true,
"$ne": null
},
}},
{"$project": {
"_id": 0,
"body.VERIFIED_MESSAGE": 1,
}},
{"$group": {
"_id": null,
"verified": {
"$push": {
"message": "$body.VERIFIED_MESSAGE"
}
}
}},
{"$project": {
"_id": 0,
"verified": 1,
}},
],
"type": "pipeline"
}
结果如下:
{
"verified": [{
"message": {
"072ade7d42d871d4fe": {
"messageId": "bcd1d991-aa63",
"create": 1486546629585,
"status": "accept",
"comment": null
}
}
},
{
"message": {
"595d0a56c": {
"messageId": "595d0a56c",
"create": 1486566646197,
"status": "reject.all",
"comment": null
}
}
},
{
"message": {
"52ffd09bf5bd541602a": {
"messageId": "1dadce1d",
"create": 1486568943752,
"status": "accept",
"comment": null
}
}
},
]
我把它放在一个数组中,但此时我不知道下一步该做什么,因为对象值会随着每个新条目而改变。有没有办法跳过这个?
我想要的是什么:
{
"verified": [{
"message": {
"messageId": "bcd1d991-aa63",
"create": 1486546629585,
"status": "accept",
}
},
{
"message": {
"messageId": "595d0a56cff27c1a2fbf3d29e6986688c49d511d",
"create": 1486566646197,
"status": "reject.all",
}
},
{
"message": {
"messageId": "1dadce1d-a5a6-4d01-b0cf-f34c5e6219eb",
"create": 1486568943752,
"status": "accept",
}
}]
}
这可能吗?
答案 0 :(得分:1)
在聚合中尝试此阶段,将您拥有的格式转换为您想要的格式:
{$project:{
message:{$arrayElemAt:[
{$map:{
input:{$objectToArray:"$body.VERIFIED_MESSAGE"},
in:{
messageId:"$$this.k",
create:"$$this.v.create",
status:"$$this.v.status"}}},
0
]}
}}
$objectToArray
表达式要求您针对MongoDB服务器版本3.4.4或更高版本运行。