Mongo 使用属性列表中的特定条目进行排序
Mongo SORT with specific entry from list of attribute
我正在使用 Mongo aggregation/filter/sorting 并使用 JAVA 进行限制。
我有以下模型对象。 CustomPOJO
是我的数据库集合。
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public List<KeyValueObject> valueList;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
public class CustomObject {
public String attribute4;
public String attribute5;
}
public class KeyValueObject {
public String name;
public String value;
}
现在我的数据库中有以下记录的条目
记录1:
{
"valueList": [{
"name": "field1",
"value": "value1"
}, {
"name": "field2",
"value": "value2"
}, {
"name": "field3",
"value": "value3"
}],
"attribute1": "attribute1",
"attribute2": "attribute2",
"attribute3": {
"attribute4": "attribute4",
"attribute5": "attribute5"
}
}
记录 2:
{
"valueList": [{
"name": "field1",
"value": "value4"
}, {
"name": "field2",
"value": "value5"
}, {
"name": "field3",
"value": "value6"
}],
"attribute1": "attribute11",
"attribute2": "attribute22",
"attribute3": {
"attribute4": "attribute44",
"attribute5": "attribute55"
}
}
我可以使用 sort(DESC,"attribute1")
或 sort(DESC,"attribute3.attribute4")
或 [=40] 对所有字段进行排序=]sort(DESC,"attribute2")
。但我无法对 valueList
进行排序。我想根据 valueList
.
中的特定 KeyValue
条目进行排序
例如,record1 有带条目 field1
的 valueList,因此数据库中的所有记录都应根据字段 1 和其中的值排序。
一般来说,我想对列表属性内的字段进行排序。
非常感谢任何帮助。
您不能直接在数组中的字段上对文档进行排序。通常我做的是 unwind
数组然后执行排序。
也许这对你有帮助。
db.collection.aggregate([
{
"$unwind": "$valueList"
},
{
"$sort": {
"valueList.name": -1
}
}
])
您不能就地使用数组的键值对进行排序。您可以使用聚合框架。
投影文档匹配键条目,然后对值进行排序,并从文档中删除附加字段。
类似
db.collection.aggregate(
[
{"$set":{
"sortdoc":{
"$arrayElemAt":[
{
"$filter":{
"input":"$valueList",
"cond":{"$eq":["$$this.name","field1"]}
}
},0]}
}},
{"$sort":{"sortdoc.value":-1}},
{"$project":{"sortdoc":0}}
])
https://mongoplayground.net/p/gzLQm8m2wQW
您还可以将 valueList 建模为对象,就像您对属性所采用的方式一样。使用 Document class 或 HashMap 而不是值列表并使用 sort(DESC,"document.field1")
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public Document document;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
文档
{
"document": {
"field1": "value1",
"field2": "value2"
},
"attribute1": "attribute1",
"attribute2": "attribute2",
"attribute3": {
"attribute4": "attribute4",
"attribute5": "attribute5"
}
}
我正在使用 Mongo aggregation/filter/sorting 并使用 JAVA 进行限制。
我有以下模型对象。 CustomPOJO
是我的数据库集合。
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public List<KeyValueObject> valueList;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
public class CustomObject {
public String attribute4;
public String attribute5;
}
public class KeyValueObject {
public String name;
public String value;
}
现在我的数据库中有以下记录的条目
记录1:
{
"valueList": [{
"name": "field1",
"value": "value1"
}, {
"name": "field2",
"value": "value2"
}, {
"name": "field3",
"value": "value3"
}],
"attribute1": "attribute1",
"attribute2": "attribute2",
"attribute3": {
"attribute4": "attribute4",
"attribute5": "attribute5"
}
}
记录 2:
{
"valueList": [{
"name": "field1",
"value": "value4"
}, {
"name": "field2",
"value": "value5"
}, {
"name": "field3",
"value": "value6"
}],
"attribute1": "attribute11",
"attribute2": "attribute22",
"attribute3": {
"attribute4": "attribute44",
"attribute5": "attribute55"
}
}
我可以使用 sort(DESC,"attribute1")
或 sort(DESC,"attribute3.attribute4")
或 [=40] 对所有字段进行排序=]sort(DESC,"attribute2")
。但我无法对 valueList
进行排序。我想根据 valueList
.
KeyValue
条目进行排序
例如,record1 有带条目 field1
的 valueList,因此数据库中的所有记录都应根据字段 1 和其中的值排序。
一般来说,我想对列表属性内的字段进行排序。
非常感谢任何帮助。
您不能直接在数组中的字段上对文档进行排序。通常我做的是 unwind
数组然后执行排序。
也许这对你有帮助。
db.collection.aggregate([
{
"$unwind": "$valueList"
},
{
"$sort": {
"valueList.name": -1
}
}
])
您不能就地使用数组的键值对进行排序。您可以使用聚合框架。
投影文档匹配键条目,然后对值进行排序,并从文档中删除附加字段。
类似
db.collection.aggregate(
[
{"$set":{
"sortdoc":{
"$arrayElemAt":[
{
"$filter":{
"input":"$valueList",
"cond":{"$eq":["$$this.name","field1"]}
}
},0]}
}},
{"$sort":{"sortdoc.value":-1}},
{"$project":{"sortdoc":0}}
])
https://mongoplayground.net/p/gzLQm8m2wQW
您还可以将 valueList 建模为对象,就像您对属性所采用的方式一样。使用 Document class 或 HashMap 而不是值列表并使用 sort(DESC,"document.field1")
@Document(collation = "CustomPOJO")
public class CustomPOJO {
public Document document;
public String attribute1;
public String attribute2;
public CustomObject attribute3;
}
文档
{
"document": {
"field1": "value1",
"field2": "value2"
},
"attribute1": "attribute1",
"attribute2": "attribute2",
"attribute3": {
"attribute4": "attribute4",
"attribute5": "attribute5"
}
}