你能幫我解決一個問題嗎?我有這個 json,但我想只回傳節點。
{
"_id":{
"userArea":NumberInt(4927)
},
"pages":{
"12":{
"page":NumberInt(2635),
"progress":"COMPLETED",
"progressType":"USER_PROGRESS",
"end":11
},
"13":{
"page":NumberInt(2627),
"progress":"COMPLETED",
"progressType":"USER_PROGRESS",
"end":ISODate("2018-04-19T15:04:29.000 0000")
}
"14":{
"page":NumberInt(2627),
"progress":"CANCELLED",
"progressType":"USER_PROGRESS",
"end":ISODate("2018-04-19T15:04:29.000 0000")
}
}
}
這樣......沒有標題
"12":{
"page":NumberInt(2635),
"progress":"COMPLETED",
"progressType":"USER_PROGRESS",
"end":11
},
"13":{
"page":NumberInt(2627),
"progress":"COMPLETED",
"progressType":"USER_PROGRESS",
"end":ISODate("2018-04-19T15:04:29.000 0000")
}
你能幫助我嗎?我只需要過濾完成的!
uj5u.com熱心網友回復:
您可以使用此聚合查詢:
- 首先用于
$objectToArray生成一個陣列,并可以使用 value 過濾值v。這是在input. - 然后使用該輸入值,您可以過濾
progress值為 not的元素CANCELLED。并再次轉換為一個物件$arrayToObject
db.collection.aggregate([
{
"$project": {
"pages": {
"$arrayToObject": {
"$filter": {
"input": {
"$objectToArray": "$pages"
},
"cond": {
"$ne": [
"$$this.v.progress",
"CANCELLED"
]
}
}
}
}
}
}
])
這里的例子
抱歉,在我第一次嘗試時,我讀到了“無標題”,我以為你想要使用$replaceRoot,但我認為這個新查詢是你想要的(也避免使用$unwind)。
但我認為您說“沒有 hedaer”是為了顯示問題中簡化的輸出。此外,如果您無法輸出標題,只需使用$replaceRoot. 這里的例子
uj5u.com熱心網友回復:
你需要像這里一樣做很多管道
db.collection.aggregate([
{
"$project": {
"p": {
"$objectToArray": "$pages"
}
}
},
{
"$unwind": "$p"
},
{
"$match": {
"p.v.progress": "COMPLETED"
}
},
{
"$group": {
"_id": "$_id",
"p": {
"$addToSet": "$p"
}
}
},
{
$project: {
"a": {
"$arrayToObject": "$p"
}
}
},
{
"$replaceRoot": {
"newRoot": "$a"
}
}
])
- 重塑,以便您可以應用過濾器。
- 再次分組以回傳您的原始架構。否則,您可以在 $match 管道處停止。
如果可能,請更改您的架構,不要使用動態鍵。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/422850.html
標籤:
上一篇:選擇集合中匹配外鍵值的檔案
