Javascript 如何使用mongoose在深度嵌套的数组上创建$slice
我正在尝试分割一个嵌套很深的数组。以下面的结构为例。我需要对这个数组进行切片以进行分页Javascript 如何使用mongoose在深度嵌套的数组上创建$slice,javascript,node.js,mongodb,express,mongoose,Javascript,Node.js,Mongodb,Express,Mongoose,我正在尝试分割一个嵌套很深的数组。以下面的结构为例。我需要对这个数组进行切片以进行分页 {messages: [{ message: { members: [ {example: object, blah: blah}, {example2: object2, blah2: blah2} ] }]} 在这种情况下,我将如何使用slice操作符 下面是我当前查询的一个示例 model.findOne({query: query}, { 'messages.0.message.members':
{messages: [{ message: { members: [ {example: object, blah: blah}, {example2: object2, blah2: blah2} ] }]}
在这种情况下,我将如何使用slice操作符
下面是我当前查询的一个示例
model.findOne({query: query}, { 'messages.0.message.members': { '$slice': [ 0, 10 ] } })
然后我返回文档,但当我切片数组以仅返回数组的前10个成员时,成员长度仍然为14
这甚至可能是不可能的,但我希望在查询中包含该切片,以限制可能会减慢其速度的任何其他逻辑
在此方面的任何帮助都将不胜感激。谢谢 我不确定通过
.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"
}
]
}
}
]
}
收集数据:
/* 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"
}
]
}
}
]
}
Ref:,我不确定通过
.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"
}
]
}
}
]
}
收集数据:
/* 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"
}
]
}
}
]
}
参考:,这太棒了!谢谢你,斯里尼瓦西!这太棒了!谢谢你,斯里尼瓦西!