【问题标题】:How can I $slice on a deeply nested array using mongoose如何使用 mongoose 在深度嵌套的数组上进行切片
【发布时间】:2020-04-10 07:11:18
【问题描述】:

我正在尝试对深度嵌套的数组进行切片。以下面的结构为例。我需要对这个数组进行切片以进行分页。

{messages: [{ message: { members: [ {example: object, blah: blah}, {example2: object2, blah2: blah2} ] }]}

在这种情况下我将如何使用切片运算符?

下面是我当前查询的示例。

model.findOne({query: query}, { 'messages.0.message.members': { '$slice': [ 0, 10 ] } })

然后我返回文档,但当我对数组进行切片以仅返回数组的前 10 个成员时,成员长度仍为 14。

这甚至不可能,但我想在查询中包含切片以限制任何其他可能减慢它的逻辑。

对此的任何帮助将不胜感激。谢谢!

【问题讨论】:

    标签: javascript node.js mongodb express mongoose


    【解决方案1】:

    我不确定通过.find() 是否容易做到这一点 - 我们知道它不起作用是因为嵌入式数组,请试试这个:

    db.YourCollectionName.aggregate([{ $match: { "_id": ObjectId("5df94e17400289966e8707a7") } },
    /** You can use $addFields if you want to retain remaining fields */
    { $project: { 'messages': { $arrayElemAt: ["$messages", 0] } } },
    { $project: { members: '$messages.message.members' } },
    { $project: { membersArr: { '$slice': ['$members', 0, 2] } } }])
    

    结果:

    /* 1 */
    {
        "_id" : ObjectId("5df94e17400289966e8707a7"),
        "membersArr" : [ 
            {
                "example" : "object",
                "blah" : "blah"
            }, 
            {
                "example2" : "object2",
                "blah2" : "blah2"
            }
        ]
    }
    

    收集数据:

    /* 1 */
    {
        "_id" : ObjectId("5df94e17400289966e8707a7"),
        "messages" : [ 
            {
                "message" : {
                    "members" : [ 
                        {
                            "example" : "object",
                            "blah" : "blah"
                        }, 
                        {
                            "example2" : "object2",
                            "blah2" : "blah2"
                        }, 
                        {
                            "example2" : "object3",
                            "blah2" : "blah3"
                        }, 
                        {
                            "example2" : "object4",
                            "blah2" : "blah4"
                        }
                    ]
                }
            }, 
            {
                "message" : {
                    "members" : [ 
                        {
                            "example" : "object11",
                            "blah" : "blah11"
                        }, 
                        {
                            "example2" : "object211",
                            "blah2" : "blah211"
                        }, 
                        {
                            "example2" : "object311",
                            "blah2" : "blah311"
                        }, 
                        {
                            "example2" : "object411",
                            "blah2" : "blah411"
                        }
                    ]
                }
            }
        ]
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5df94e28400289966e870b34"),
        "messages" : [ 
            {
                "message" : {
                    "members" : [ 
                        {
                            "example" : "objectF",
                            "blah" : "blah"
                        }, 
                        {
                            "example2" : "objectF2",
                            "blah2" : "blah2"
                        }, 
                        {
                            "example2" : "objectF3",
                            "blah2" : "blah3"
                        }, 
                        {
                            "example2" : "objectF4",
                            "blah2" : "blah4"
                        }
                    ]
                }
            }
        ]
    }
    

    参考: $addFields , $arrayElemAt , $slice

    【讨论】:

    • 这太棒了!谢谢你!
    猜你喜欢
    • 2021-04-17
    • 2021-04-29
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    相关资源
    最近更新 更多