根据字段值指定的嵌入对象的字段值对MongoDB集合进行排序?
在MongoDB中,如何根据由另一个字段值指定的嵌入对象的字段值对查询结果进行排序 以下是数据的表示:根据字段值指定的嵌入对象的字段值对MongoDB集合进行排序?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在MongoDB中,如何根据由另一个字段值指定的嵌入对象的字段值对查询结果进行排序 以下是数据的表示: { field1 : 'value', field2: 'value', data: [ fields": [ { _id: "5a8fdd13de5b074d4d4f572c", field: "location", value: "Antwerp" }, { _id: "5a8fdd13de5b074d4d4f572b",
{
field1 : 'value',
field2: 'value',
data: [
fields": [
{
_id: "5a8fdd13de5b074d4d4f572c",
field: "location",
value: "Antwerp"
},
{
_id: "5a8fdd13de5b074d4d4f572b",
field: "title",
value: "This is a good title"
},
{
_id: "5a8fdd13de5b074d4d4f572a",
field: "employmentType",
value: "Temporary"
}
]}
例如,我有一个包含像这样的文档的集合,我想根据data.fields.value
对整个集合进行排序。我只有data.fields.field
我该怎么做?提前谢谢
db.collection_name.aggregate([
{$sort : {"data.fields.value" : 1}}
])
将按升序对结果进行排序
如果要按降序排列集合,可以将
1
替换为-1
。您有嵌套的子文档。要对嵌套的子文档进行排序,请将其展开到该特定文档
db.collection_name.aggregate(
{$unwind: "$data"},
{$unwind: "$data.fields"},
{$sort : {"data.fields.value" : -1}},
{$group: {_id:"$_id", fields: {$push:"$data.fields"}}})
db.col.aggregate([
{"$addFields":{
"mfield":{
"$arrayElemAt":{
"$filter":{
"input":{"$arrayElemAt":["$data.fields",0]},
"as":"field",
"cond":{
"$let":{
"vars":{"fieldkv":{"$objectToArray":"$$field"}},
"in":{
"$and":[
{"$in":["field", "$$fieldkv.k"]},
{"$in":["location", "$$fieldkv.v"]}
]
}
}
}
}
}
}},
{"$sort":{"mfield.value":-1}},
{"$project":{"mfield":0}}
])
您可以在3.4中尝试下面的聚合 其想法是将字段投影到与字段匹配的位置<代码>位置在下面的查询中 将计算出的文档保留为文档中的额外字段,后跟文档中的“按值排序”字段
db.collection_name.aggregate(
{$unwind: "$data"},
{$unwind: "$data.fields"},
{$sort : {"data.fields.value" : -1}},
{$group: {_id:"$_id", fields: {$push:"$data.fields"}}})
db.col.aggregate([
{"$addFields":{
"mfield":{
"$arrayElemAt":{
"$filter":{
"input":{"$arrayElemAt":["$data.fields",0]},
"as":"field",
"cond":{
"$let":{
"vars":{"fieldkv":{"$objectToArray":"$$field"}},
"in":{
"$and":[
{"$in":["field", "$$fieldkv.k"]},
{"$in":["location", "$$fieldkv.v"]}
]
}
}
}
}
}
}},
{"$sort":{"mfield.value":-1}},
{"$project":{"mfield":0}}
])
将字段中的字段对象转换为内部的键值对数组,以匹配键(字段)和值(位置)
使用“排除”删除排序文档以获取具有原始字段的文档
将包含单个文档的数组转换为单个文档
db.collection_name.aggregate(
{$unwind: "$data"},
{$unwind: "$data.fields"},
{$sort : {"data.fields.value" : -1}},
{$group: {_id:"$_id", fields: {$push:"$data.fields"}}})
db.col.aggregate([
{"$addFields":{
"mfield":{
"$arrayElemAt":{
"$filter":{
"input":{"$arrayElemAt":["$data.fields",0]},
"as":"field",
"cond":{
"$let":{
"vars":{"fieldkv":{"$objectToArray":"$$field"}},
"in":{
"$and":[
{"$in":["field", "$$fieldkv.k"]},
{"$in":["location", "$$fieldkv.v"]}
]
}
}
}
}
}
}},
{"$sort":{"mfield.value":-1}},
{"$project":{"mfield":0}}
])
你好,你已经试过自己完成这个了吗?这个网站帮助解决错误,而不是为您编写代码是的,我有,但我最终发现我需要使用嵌套文档中的值对父文档进行排序。我还没有找到如何做到这一点…不知道你所说的你有
字段是什么意思。字段是否为用户输入?字段
与值
的关系如何?哦,是的,不清楚。我现在修好了!我的意思是data.fields.field
和data.fields.value
学到了一些新的东西,不知道放松
。那不是我想要的。。。我想根据嵌套文档的字段对父文档进行排序。我使用data.fields.field
field指定了哪个嵌套文档,这不是与db.collection\u name.find().sort({“data.fields.value”:1})相同吗?我想对特定的data.fields.value
进行排序,该值由data.fields.field
的值指定。我还没有找到一个方法来做这个…看起来不错!要获取我要排序的字段的索引,我可以使用(在以前的聚合中)$indexOfArray吗?可以。您想做什么?您在示例中指定要使用字段:'location'
按对象排序。因此,在$arrayElemAt
中使用索引0。我想要排序的字段没有设置,所以它必须是动态的。使用$indexOfArray
获取索引将使此索引成为动态的,不?$arrayElemAt
,索引为0,以输出数据
数组中的第一个元素,即字段
。不是这样吗?我明白了。但是您在$arrayElemAt中使用了$data.fields
,这不就是字段中的第一个元素吗?