在MongoDB中按数组排序时忽略空值
我有MongoDB收集项目,包括以下文档:在MongoDB中按数组排序时忽略空值,mongodb,sorting,Mongodb,Sorting,我有MongoDB收集项目,包括以下文档: { "values" : [1, 2] } { "values" : [5, null] } { "values" : [-5, null] } 是否有任何方法可以在不使用null值的情况下按值对集合进行排序?我目前的查询是: db.items.aggregate([{"$sort": {"values": 1}}]) 因此: { "val
{ "values" : [1, 2] }
{ "values" : [5, null] }
{ "values" : [-5, null] }
是否有任何方法可以在不使用null值的情况下按值对集合进行排序?我目前的查询是:
db.items.aggregate([{"$sort": {"values": 1}}])
因此:
{ "values" : [5, null] }
{ "values" : [-5, null] }
{ "values" : [1, 2] }
第一个值是[5,null]和[-5,null],因为null是集合中最小的值。但是,我希望忽略空值并仅按数字排序,因此:
{ "values" : [-5, null] }
{ "values" : [1, 2] }
{ "values" : [5, null] }
当没有数字时,两个值都为空,文档应该是结果中的最后一个。您可以使用以下阶段进行操作
如果要忽略整个数组,即使其中一个值为null,也可以跳过展开和分组阶段。可以使用以下阶段进行操作 如果要忽略整个数组,即使其中一个值为null,也可以跳过展开和分组阶段。其他备选方案: 解决方案1:如果不需要保存数组本身中的所有null值[]或null字段 使用筛选出非空元素,所有空元素数组将为空,使用then on值从文档中筛选出该元素 解决方案2:在我看来,这不是一个很好的方法,但可以完成工作并保留文档和空值 首先将null值转换为null字符串,以便$sort顺序根据字段类型工作。使用将空字符串转换回空字符串 其他备选方案: 解决方案1:如果不需要保存数组本身中的所有null值[]或null字段 使用筛选出非空元素,所有空元素数组将为空,使用then on值从文档中筛选出该元素 解决方案2:在我看来,这不是一个很好的方法,但可以完成工作并保留文档和空值 首先将null值转换为null字符串,以便$sort顺序根据字段类型工作。使用将空字符串转换回空字符串 你可以试试这个 $addFields要创建值\u使用$map克隆值,请将null替换为字符串null,因为排序时它将最后排序 $按值排序\u按升序克隆 $project要隐藏值\u克隆 你可以试试这个 $addFields要创建值\u使用$map克隆值,请将null替换为字符串null,因为排序时它将最后排序 $按值排序\u按升序克隆 $project要隐藏值\u克隆
一个很好的解决方案很喜欢价值观克隆的方法。但是如果值的两个元素都是[null,null],这也会丢失文档。@ambianBeing,谢谢,是的,我意识到这会解决一些问题,你有太好的解决方案了,一个很好的解决方案,以及喜欢值的方法。但是如果值的两个元素都是[null,null],这也会丢失文档。@ambianBeing,谢谢,是的,我意识到这可以解决这个问题,你有太好的解决方案了
db.collection.aggregate([
{
$unwind: "$values" //unwind them to skip null values
},
{
$match: {
"values": { //skip null values
$ne: null
}
}
},
{
"$sort": { //sorting pipeline
"values": 1
}
},
{
$group: { //regrouping them
"_id": "$_id",
"values": {
$push: "$values"
}
}
}
])
db.collection.aggregate([
{
$project: {
values: {
$filter: {
input: "$values",
as: "d",
cond: {
$ne: [
"$$d",
null
]
}
}
}
}
},
{
$match: {
"values": {
$ne: []
}
}
},
{
"$sort": {
"values": 1
}
}
]);
db.collection.aggregate([
{
$project: {
values: {
$map: {
input: "$values",
as: "d",
in: {
$cond: {
if: {
$eq: [
"$$d",
null
]
},
then: "null",
else: "$$d"
}
}
}
}
}
},
{
"$sort": {
"values": 1
}
},
{
$project: {
values: {
$map: {
input: "$values",
as: "d",
in: {
$cond: {
if: {
$eq: [
"$$d",
"null"
]
},
then: null,
else: "$$d"
}
}
}
}
}
}
]);
db.collection.aggregate([
{
$addFields: {
values_clone: {
$map: {
input: "$values",
as: "v",
in: {
$cond: {
if: { $eq: ["$$v", null] },
then: "null",
else: "$$v"
}
}
}
}
}
},
{ $sort: { values_clone: 1 } },
{ $project: { values_clone: 0 } }
])