Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
Javascript MongoDB查找字段不存在的所有文档';t存在,加上如果存在应用字段运算符($max)条件_Javascript_Mongodb_Mongoose_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript MongoDB查找字段不存在的所有文档';t存在,加上如果存在应用字段运算符($max)条件

Javascript MongoDB查找字段不存在的所有文档';t存在,加上如果存在应用字段运算符($max)条件,javascript,mongodb,mongoose,mongodb-query,aggregation-framework,Javascript,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我正在查找聚合中的$match阶段的查询,该阶段的功能几乎与,as,but.相同 若文档中不存在字段(在我的例子中命名为rank),请将文档添加到结果中 但如果字段存在,则将条件(在我的示例中是)应用于此字段,并将所有符合此条件的文档添加到结果中 结果应该是这样的: [ { "method": 3, "item": 1, "rank": 3 //because it has field named rank, and suits condition {rank:

我正在查找聚合中的
$match
阶段的查询,该阶段的功能几乎与,as,but.相同

  • 若文档中不存在字段(在我的例子中命名为rank),请将文档添加到结果中
  • 但如果字段存在,则将条件(在我的示例中是)应用于此字段,并将所有符合此条件的文档添加到结果中

结果应该是这样的:

[
  {
    "method": 3,
    "item": 1,
    "rank": 3 //because it has field named rank, and suits condition {rank: $max}
  },
  {
    "method": 4,
    "item": 1 //we need this, because document doesn't have rank field at all
  },
  {
    "method": 5,
    "item": 1 //we need this, because document doesn't have rank field at all
  }
]
我已经尝试过的事情:

            {
                $match: {
                    $or: [
                        {item: id, rank: {$exists: true, $max: "$rank"}}, //id === 1
                        {item: id, rank: {$exists: false}} //id === 1
                    ]
                }
            }
UPD:到目前为止,我可能不会仅限于
$match
阶段,
$project
在默认匹配之后也是相关的,因此我可以通过
id
请求
$match
阶段中的每个文档,不管文档
是否排序
字段,然后在
$project
阶段进行“分离”按等级
$exists

试试这个:

db.collection.aggregate([
  {
    $match: {
      item: id
    }
  },
  {
    $group: {
      _id: "$item",   //<- Change here your searching field
      max: {
        $max: "$rank" //<- Change here your field to apply $max
      },
      data: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $match: {
      $expr: {
        $or: [
          {
            $eq: [
              {
                $type: "$data.rank"
              },
              "missing"
            ]
          },
          {
            $eq: [
              "$data.rank",
              "$max"
            ]
          }
        ]
      }
    }
  },
  {
    $replaceWith: "$data"
  }
])
db.collection.aggregate([
{
$match:{
项目:id
}
},
{
$group:{

_id:“$item”,//我找到了一个答案,与@Valijon的方法不同,但它也是基于上述逻辑。我的查询是:

db.collection.aggregate([
  {
    $match: {
      item: id
    }
  },
  {
    $project: {
      method: 1,
      item: 1,
      rank: {
        $ifNull: [
          "$rank",
          0
        ]
      }
    }
  },
  {
    $group: {
      _id: "$item",
      data: {
        $addToSet: "$$ROOT"
      },
      min_value: {
        $min: "$rank"
      },
      max_value: {
        $max: "$rank"
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    $match: {
      $or: [
        {
          $expr: {
            $eq: [
              "$data.rank",
              "$max_value"
            ]
          }
        },
        {
          $expr: {
            $eq: [
              "$data.rank",
              "$min_value"
            ]
          }
        },
      ]
    }
  }
])
我的查询基于
$project
阶段,该阶段给出了空字段值0。它也可以是-1,也可以是集合中未使用的任何值。然后我分离结果


不清楚您想做什么…在示例+预期结果中,您跳过了前两个文档…请提供有效的示例/预期结果…@Valijon是吗?我想查找集合中没有特定字段的每个文档,但如果有,则将应用条件应用于此字段。此条件应具有field操作员。猜猜,再简单不过了。现在它更清楚了,谢谢。检查我的回答,谢谢你,你比我更快/更好,所以我接受它作为答案。另外,我目前正在基于
$project
stage和
$ifNull
开发变体。