【问题标题】:MongoDB Operator for filtering documents which a specific field has only specified value?用于过滤特定字段仅具有指定值的文档的 MongoDB 运算符?
【发布时间】:2020-07-20 08:40:23
【问题描述】:

我想从以下集合中获取 URL,其中状态字段只有 400(结果必须是:bc)。有人知道这方面的任何单个 mongoDB 查询运算符吗?

收藏:

url, status

  a,  200
  a,  400
  b,  400
  c,  400

收藏图片:

结果必须是:

b, c

我想要上述结果如何?

  • 仅包含 400 个状态文档
  • 如果 URL 和状态相同,则只包括其中的单个文档
  • 如果 URL 相同且状态不同,则不要包含其中任何一个

【问题讨论】:

  • @turivishal,我批准了您的编辑。现在问题更清楚了。干得好!

标签: mongodb


【解决方案1】:

希望我理解正确,

  • $group by url 并将所有内容存储在 root 字段中
db.collection.aggregate([
  {
    $group: {
      _id: "$url",
      status: {
        $push: "$status"
      },
      root: {
        $push: "$$ROOT"
      },
      count: {
        $sum: 1
      }
    }
  },
  • $match 所有不等于400 的元素使用$ne$not$ne 进行相反匹配,这意味着等于400
  /** MATCH ALL HAVE 400 STATUS*/
  {
    $match: {
      "status": {
        $not: {
          $elemMatch: {
            $ne: "400"
          }
        }
      }
    }
  },
  • $unwind root 变量并使用 $replaceRoot 替换为根目录
  {
    $unwind: "$root"
  },
  {
    $replaceRoot: {
      newRoot: "$root"
    }
  },
  • $group url 用于删除相同状态的重复项,创建新变量 roots 并存储“$$ROOT”
  {
    $group: {
      _id: "$url",
      roots: {
        $first: "$$ROOT"
      }
    }
  },
  • 再次$replaceRootroots 变量
  {
    $replaceRoot: {
      newRoot: "$roots"
    }
  }
])

结果:

[
  {
    "_id": 4,
    "status": "400",
    "url": "c"
  },
  {
    "_id": 3,
    "status": "400",
    "url": "b"
  }
]

工作场所: https://mongoplayground.net/p/C6tC8ho1t6M

【讨论】:

  • 您能否检查以下操场:mongoplayground.net/p/VJJpSLT5Fi5 并指导我如何修改您的查询以获得高于预期的结果。刚刚更改了 Playground 中的一些数据。
  • 没有结果必须只有一个 c url。我的意思是结果必须相同。
  • 您可以查看更新的答案以及游乐场链接。
【解决方案2】:

我建议你看看Official Documentation for 'find()'

我不知道您是否使用 javascript 或其他东西,但您在 status 列之后过滤的方法看起来像('test' 是您的集合名称):

db.test.find( { "status": "400" } )

这意味着您将“找到”您的 status等于到 400 的所有值作为 字符串

【讨论】:

  • 我更新了问题,发现不是操作员得到所需的结果。感谢您尝试回答问题!
  • distinct 这样的东西怎么样? db.test.distinct( 'status', { 'status': { '$ne': '200' }}) 这意味着我们得到了status 列中的所有变量,没有200 中的变量
  • 它只适用于这种情况。能想出一个更通用的查询吗?查询中只使用 400 个状态?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-26
  • 2016-06-08
  • 1970-01-01
  • 2016-06-18
  • 2017-08-07
  • 1970-01-01
相关资源
最近更新 更多