如何使用 mongoose 在深度嵌套的数组上进行切片

Posted

技术标签:

【中文标题】如何使用 mongoose 在深度嵌套的数组上进行切片【英文标题】:How can I $slice on a deeply nested array using 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。

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

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

【问题讨论】:

【参考方案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

【讨论】:

这太棒了!谢谢你!

以上是关于如何使用 mongoose 在深度嵌套的数组上进行切片的主要内容,如果未能解决你的问题,请参考以下文章

$push 进入深度嵌套的数组 mongoose

MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用

如何使用 'type' 在 mongoose 中使用嵌套模式来创建数组?

如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组

如何在 mongodb/mongoose 的嵌套数组中检查是不是存在并更新对象?

如何使用 Node.js 和 Mongoose 将对象添加到嵌套数组