请帮助在mongodb中进行查询。我希望mongo查询在哪种排序数组对象中使用某种表达式。举例说明。我有这样的文件
{
"_id:"5e0846c922427bdc824d3943",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "kevin"
},
{
"custom_field_id" : "lname",
"field_value" : "patel"
},
{
"custom_field_id" : "city",
"field_value" : "surat"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Boy"
},
{
"_id":"5e08471d6053718c808cbab8",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "alice"
},
{
"custom_field_id" : "lname",
"field_value" : "somani"
},
{
"custom_field_id" : "city",
"field_value" : "bharuch"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Boy"
},
{
"_id":"5e0847392b8622f8100267e3",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "Isha"
},
{
"custom_field_id" : "lname",
"field_value" : "Trivedi"
},
{
"custom_field_id" : "city",
"field_value" : "Mumbai"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Girl"
}
当在custom_field_id = "fname“上传递过滤器参数时,它将按照升序或下降的方式显示结果。
{
"_id":"5e08471d6053718c808cbab8",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "alice"
},
{
"custom_field_id" : "lname",
"field_value" : "somani"
},
{
"custom_field_id" : "city",
"field_value" : "bharuch"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Boy",
},{
"_id":"5e0847392b8622f8100267e3",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "Isha"
},
{
"custom_field_id" : "lname",
"field_value" : "Trivedi"
},
{
"custom_field_id" : "city",
"field_value" : "Mumbai"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Girl",
},
{
"_id:"5e0846c922427bdc824d3943",
"isActive" : true,
"customFieldArray" : [
{
"custom_field_id" : "fname",
"field_value" : "kevin"
},
{
"custom_field_id" : "lname",
"field_value" : "patel"
},
{
"custom_field_id" : "city",
"field_value" : "surat"
}
],
"creationMode" : "adminForm",
"createdAt" : ISODate("2019-11-21T06:40:20.033Z"),
"updatedAt" : ISODate("2019-11-21T06:40:20.033Z"),
"gender" : "Boy"
}
发布于 2019-12-30 19:44:31
聚合根据输入INPUT_EXPRESSION和SORT_ORDER对文档进行排序。输入表达式与customFieldArray
的S custom_field_id
值匹配,并根据相应的field_value
对文档进行排序。
var INPUT_EXPRESSION = "fname"; // values can be "fname", "city" or "lname"
var SORT_ORDER = 1; // values can be 1 (ascending) or -1 (descending)
db.test.aggregate( [
{
$addFields: {
customFieldTemp: {
$filter: {
input: "$customFieldArray",
as: "arr",
cond: {
$eq: [ "$arr.custom_field_id", INPUT_EXPRESSION ]
}
}
}
}
},
{
$addFields: {
customFieldTemp: { $arrayElemAt: [ "$customFieldTemp", 0 ] }
}
},
{
$sort: { "customFieldTemp.field_value" : SORT_ORDER }
},
{
$project: { customFieldTemp: 0 }
}
] )
示例:
从问题帖子中的示例输入文档中,如果INPUT_EXPRESSION = "city“和SORT_ORDER = 1,则文档排序为:_id: "5e08471d6053718c808cbab8"
("bharuch")、_id: "5e0847392b8622f8100267e3"
(”孟买“)和_id: "5e0846c922427bdc824d3943"
("surat")。
发布于 2019-12-24 00:22:04
根据MongoDB文档这里,$elemMatch操作符将查询结果中字段的内容限制为只包含与$elemMatch条件匹配的第一个元素。
例如
db.collectionName.aggregate({$match: {'customFieldArray.custom_field_id' : 'lname'}})
关于进一步的参考资料,MongoDB发现()什么都得不到,MongoDB如何使用随机名称查询对象中的数据?
https://dba.stackexchange.com/questions/256185
复制相似问题