Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MongoDB中按数组排序时忽略空值_Mongodb_Sorting - Fatal编程技术网

在MongoDB中按数组排序时忽略空值

在MongoDB中按数组排序时忽略空值,mongodb,sorting,Mongodb,Sorting,我有MongoDB收集项目,包括以下文档: { "values" : [1, 2] } { "values" : [5, null] } { "values" : [-5, null] } 是否有任何方法可以在不使用null值的情况下按值对集合进行排序?我目前的查询是: db.items.aggregate([{"$sort": {"values": 1}}]) 因此: { "val

我有MongoDB收集项目,包括以下文档:

{ "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 } }
])