MongoDB聚合操作的$match阶段与条件查询。

huangapple go评论65阅读模式
英文:

MongoDB aggregate $match stage with conditional query

问题

我想在MongoDB聚合中进行匹配阶段,在此匹配中,我想检查是否存在条件,使用自定义查询,如果不存在,则使用另一个自定义查询。这些自定义查询是嵌套字段。

在搜索和阅读文档后,我编写了这段代码。但是它出现了一个错误。

我使用的是MongoDB v4.4版本。只能使用这个版本,不能切换到其他版本。

MongoError:FieldPath字段名称不能包含'.'。

{
  $match : {
    $expr : {
      $cond : {
        if: { $eq : [ 'type' , 'country'] },
        then: { 
          $and : [
            { 'countryState.status' : 'Confirmed' },
            { 'countryState.prop' : 'high' },		   
          ]
        },
        else: {  },
      }
    }
  }
},

如果'type'字段等于'country',我想使用自定义查询,如果不是,则只使用{}查询。

我将不胜感激,如果有人可以帮我,告诉我如何使用带有条件查询的匹配阶段。

英文:

I want to do a match stage in mongoDB aggregate, and in this match I want to check if a condition exists, use a custom query, and if not, use another custom query. The custom queries are nested fields.

after searching and reading documents , I write this code. But it has an error.

I use MongoDB v4.4 . only this version and cannot switch to other versions.

MongoError: FieldPath field names may not contain '.'.

{
  $match : {
    $expr : {
      $cond : {
        if: { $eq : [ 'type' , 'country'] },
        then: { 
          $and : [
            { 'countryState.status' : 'Confirmed' },
            { 'countryState.prop' : 'high' },		   
          ]
        },
        else: {  },
      }
    }
  }
},

If the 'type' field, is equal to country, I want to use the custom query, and if not, only {} query.

I would appreciate anyone can help me, how to this match stage with conditional query.

答案1

得分: 3

您正在要求查询返回"这个或那个",因此我们应该使用 $or。借用了 @cmgchess 游乐场链接中的示例数据,我相信以下查询应该在逻辑上实现您想要的功能:

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "type": "country",
          "countryState.status": "Confirmed",
          "countryState.prop": "high"
        },
        {
          "type": {
            $ne: "country"
          }
        }
      ]
    }
  }
])

演示

英文:

You are asking for the query to return "this or that", so we should use $or. Borrowing the sample data from @cmgchess playground link, this query should logically do what you want I believe:

db.collection.aggregate([
  {
    $match: {
      $or: [
        {
          "type": "country",
          "countryState.status": "Confirmed",
          "countryState.prop": "high"
        },
        {
          "type": {
            $ne: "country"
          }
        }
      ]
    }
  }
])

Demo

huangapple
  • 本文由 发表于 2023年5月28日 22:08:03
  • 转载请务必保留本文链接:https://go.coder-hub.com/76351893.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定