簡體   English   中英

如何在 mongodb 的嵌套子數組中使用 $filter?

[英]How to use $filter in nested child array with mongodb?

我的mongodb數據是這樣的,我想過濾memoryLine。

{
"_id" : ObjectId("5e36950f65fae21293937594"),
"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
        "noteId" : ObjectId("5e36953665fae212939375a0"),
        "time" : ISODate("2020-02-02T17:24:06.460Z"),
        "memoryLine" : [ 
            {
                "_id" : ObjectId("5e36953665fae212939375ab"),
                "memoryTime" : ISODate("2020-02-03T17:54:06.460Z")
            }, 
            {
                "_id" : ObjectId("5e36953665fae212939375aa"),
                "memoryTime" : ISODate("2020-02-03T05:24:06.460Z")
            }
        ]
    }
]}

我想像這樣獲得 memoryTime 比現在更好的項目,

"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
    "noteId" : ObjectId("5e36953665fae212939375a0"),
    "time" : ISODate("2020-02-02T17:24:06.460Z"),
    "memoryLine" : [ 
        {
            "_id" : ObjectId("5e36953665fae212939375ab"),
            "memoryTime" : ISODate("2020-02-03T17:54:06.460Z")
        }, 
        {
            "_id" : ObjectId("5e36953665fae212939375aa"),
            "memoryTime" : ISODate("2020-02-03T05:24:06.460Z")
        }
    ]
}]

所以是使用如下代碼。我在 memoryLine 中使用 $filter 來過濾以獲得正確的項目。

aggregate([{
    $match: {
        "$and": [
            { userId:  "5e33ee0b4a3895a6d246f3ee"},
        ]
    }
}, {
    $project: {
        userId: 1,
        notes: {
            noteId: 1,
            time: 1,
            memoryLine: {
                $filter: {
                    input: "$memoryLine",
                    as: "mLine",
                    cond: { $gt: ["$$mLine.memoryTime", new Date(new Date().getTime() + 8 * 1000 * 3600)] }
                }
            }
        }
    }
}]).then(doc => {
    res.json({
        code: 200,
        message: 'success',
        result: doc
    })
});

但是我得到了這個,memoryLine 為空,為什么?我嘗試將 $gt 更改為 $lt,但也得到了空值。

"userId" : "5e33ee0b4a3895a6d246f3ee",
"notes" : [ 
    {
    "noteId" : ObjectId("5e36953665fae212939375a0"),
    "time" : ISODate("2020-02-02T17:24:06.460Z"),
    "memoryLine" : null  <<<-------------  here is not right
}]

您可以使用$ addFields以取代現有的現場, $地圖為外收集和$過濾器的內:

db.collection.aggregate([
    {
        $addFields: {
            notes: {
                $map: {
                    input: "$notes",
                    in: {
                        $mergeObjects: [
                            "$$this",
                            { 
                                memoryLine: {
                                    $filter: {
                                        input: "$$this.memoryLine",
                                        as: "ml",
                                        cond: {
                                            $gt: [ "$$ml.memoryTime", new Date() ]
                                        }
                                    }
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
])

$mergeObjects用於避免源memoryLine對象中的重復字段。

蒙戈游樂場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM