mongodb - 在 MongoDB 中对一组子文档进行排序(不使用聚合)
问题描述
我正在尝试使用属于对象数组的字段在 Mongo 中进行排序。问题是我无法使用聚合,并且由于外部约束而无法修改架构。
这是我的文件的一个例子
[{
"name": "product 1",
"tags": [{
"tag": "category",
"value": "shoes"
},{
"tag": "gender",
"value": "man"
}]
},
{
"name": "product 2",
"tags": [{
"tag": "category",
"value": "bags"
},{
"tag": "season",
"value": "fall-winter"
}]
},
{
"name": "product 3",
"tags": [{
"tag": "category",
"value": "clothing"
},{
"tag": "gender",
"value": "woman"
}]
}]
假设我想使用标签类别对它们进行升序排序,所以我应该以这种方式对文档进行排序:“产品 2”、“产品 3”、“产品 1”
有没有一种方法可以在不聚合且不修改架构的情况下做到这一点?
解决方案
...我不能使用聚合...
如果“类别”子文档是数组的第一个元素,则以下代码将进行排序。tags
db.product_cats.find().toArray().sort( (a, b) => {
return a.tags[0].value > b.tags[0].value;
});
如果“类别”子文档出现在数组的任何索引处,则以下将进行排序。
db.product_cats.find().toArray().sort( (a, b) => {
let ixa = a.tags.findIndex(e => e.tag == "category");
let ixb = b.tags.findIndex(e => e.tag == "category");
return a.tags[ixa].value > b.tags[ixb].value;
});
如果某些文档缺少“类别”子文档,那么这将进行排序:
db.product_cats.find().toArray().sort( (a, b) => {
let ixa = a.tags.findIndex(e => e.tag == "category");
let ixb = b.tags.findIndex(e => e.tag == "category");
if ( ixa == -1 ) { a.tags = [ ]; a.tags[ ixa] = { value: "" } };
if ( ixb == -1 ) { b.tags = [ ]; b.tags[ ixa] = { value: "" } };
return a.tags[ixa].value > b.tags[ixb].value;
});
推荐阅读
- google-cloud-platform - 为 pod 和服务配置 Terraform GKE 插件 IP 范围
- python - 如何确定初始猜测值并最小化以找到参数
- arrays - MongoDB:使用数组进行聚合
- ms-access - 将列表框中的选定项目与单选按钮相结合保存到新字段中
- javascript - jQuery 不在 Primefaces 视图中执行?
- java - 比较两个文本时如何找到不相似的行
- c++ - 如何访问一行 C++ 字符矩阵?
- angular - 向 Angular 材质禁用字段添加验证
- algorithm - Fence - 波兰信息学奥林匹克竞赛的任务
- websphere - IBM Edge 组件执行器在运行时出错