聚合 mongodb - 从对象中的子对象搜索字段和值
Aggregation mongodb - Search field and value from sub-object in object
我想用值过滤掉一个字段。我已经使用 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",
}
}]
}
这可能吗?
在聚合中尝试这一阶段,将您拥有的格式转换为您想要的格式:
{$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 或更高版本。
我想用值过滤掉一个字段。我已经使用 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",
}
}]
}
这可能吗?
在聚合中尝试这一阶段,将您拥有的格式转换为您想要的格式:
{$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 或更高版本。