如何使用 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 在深度嵌套的数组上进行切片的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB Mongoose 聚合查询深度嵌套数组删除空结果并填充引用
如何使用 'type' 在 mongoose 中使用嵌套模式来创建数组?
如何使用来自@nestjs/mongoose 的@Prop 装饰器添加嵌套的对象数组