mongodb - 单个对象数组排序和切片不起作用
问题描述
我在这样的集合中有一个条目:
{
"_id" : ObjectId("60c6f7a5ef86bd1a5402e928"),
"cid" : 1,
"array1" : [
{ "type": "car", value: 20 },
{ "type": "bike", value: 50 },
{ "type": "bus", value: 5 },
{ "type": "cycle", value: 100 },
...... 9000 more entry something like this
],
"array2" : [
{ "type": "laptop", value: 200 },
{ "type": "desktop", value: 15 },
{ "type": "tablet", value: 55 },
{ "type": "mobile", value: 90 },
...... 9000 more entry something like this
]
}
现在我想为分页目的对数据进行排序和切片。
为此,我编写了适用于切片情况但不适用于排序情况的查询。这是我的查询,适用于切片案例
let val = await SomeCollectionName.findOne(
{ cid: 1 },
{ _id: 1 , array1: { $slice: [0, 10] } } ---> its return the 10 data. Initially it return from 0 to 10, then next call $slice: [10, 10]
).exec();
if (val) {
//console.log('Got the value')
}
console.log(error)
这是我的查询当我使用切片添加排序时
let val = await SomeCollectionName.findOne(
{ cid: 1 },
{ _id: 1 , array1: { $sort: { value: -1 }, $slice: [0, 10] } }
).exec();
if (val) {
//console.log('Got the value')
}
console.log(error)
有没有人指导我哪里错了,或者建议我什么是获取数据的有效方法。
更新
我从上述问题中得到答案,并为两个数组寻找相同的实现。一切都是一样的。早些时候我正在处理 1 个数组,这次我必须处理两个数组。
只是想知道这些事情是如何发生的,我编写了聚合查询,但一个数组结果很好,但其他数组在整个数组中返回相同的数据。
这是我根据使用排序和切片处理单个数组的建议的查询
db.collection.aggregate([
{
"$match": {
"cid": 1
}
},
{
$unwind: "$array1"
},
{
$unwind: "$array2"
},
{
"$sort": {
"array1.value": -1,
"array2.value": -1,
}
},
{
$skip: 0
},
{
$limit: 3
},
{
$group:{
"_id":"$_id",
"array1":{$push:"$array1"},
"array2":{$push:"$array2"}
}
}
])
解决方案
问题是 findOne() 在其投影参数中不支持 $sort 。
您可以改为使用聚合来实现预期结果,
db.collection.aggregate([
{
"$match": {
"cid": 1
}
},
{
$unwind: "$array1"
},
{
"$sort": {
"array1.value": -1
}
},
{
$skip: 0
},
{
$limit: 3
},
{
$group: {
"_id": "$_id",
"array1": {
$push: {
"type": "$array1.type",
"value": "$array1.value"
}
},
"array2": {
"$first": "$array2"
}
},
},
{
$unwind: "$array2"
},
{
"$sort": {
"array2.value": -1
}
},
{
$skip: 0
},
{
$limit: 3
},
{
$group: {
"_id": "$_id",
"array2": {
$push: {
"type": "$array2.type",
"value": "$array2.value"
}
},
"array1": {
"$first": "$array1"
}
},
}
])
推荐阅读
- android - Gradle AndroidStudio上生成signedbundle时如何重命名实现app-release.aab
- google-cloud-storage - GCS:如何使用最低权限服务帐户备份和保留版本
- javascript - #heremaps 如何在javascript中单击集群时获取信息气泡中的数据
- vba - 对于每个 +if (or) 语句
- networking - 可以通过IPV6实现端口转发的功能吗?
- javascript - JavaScript:找到最大间隔重叠的点
- php - SQL中where子句的两个条件
- php - 验证失败时,Laravel 将数据从 FormRequest 传输到 Controller
- node.js - 在节点js中使用featherjs进行分页
- amazon-web-services - 如何使用 Amazon Route 53 (CLI) 创建子域