【问题标题】:MongoDB - get another field's value without updatingMongoDB - 在不更新的情况下获取另一个字段的值
【发布时间】:2021-12-13 05:31:36
【问题描述】:

在运行 mongoDB 查找查询时,在某些特殊情况下,我想返回另一个字段的值,但不更新原始字段。

一位客户正在寻找特定价格范围内的顾问。一些辅导员正在做面对面的咨询,其他的只是虚拟的。一些辅导员有固定价格(字段:price),另一些辅导员有不同的面对面和虚拟辅导价格(字段:in_person_price、virtual_price)。在这种情况下,他们的“价格”字段设置为 0,这将使查询选择另一个要显示的字段。

会有一个外部变量“in_person”是真还是假,它决定了客户在搜索时看到的价格。

因此,例如,如果辅导员的“价格”为 0,则“in_person_price”为 145,“virtual_price”为 90...

如果 "in_person" 变量被标记为 true,则 mongoDB 查询返回的 "price" 将为 145

如果 "in_person" 变量被标记为 false,mongoDB 查询返回的 "price" 将为 90

下面是伪代码查询:

db.counselors.find({价格: //如果“price”字段为0... {如果“in_person”为真,返回in_person_price,否则返回virtual_price } else return price })

那么我该如何将这个想法转化为一个可行的 mongoDB 查询呢?

【问题讨论】:

  • 您能否使用真实的 JSON 文档重写问题,以及这些案例的预期输出?检查聚合和$cond 它可能会帮助你
  • 请修剪您的代码,以便更容易找到您的问题。请按照以下指南创建minimal reproducible example

标签: mongodb mongodb-query conditional-operator


【解决方案1】:

检查这个playground

使用“聚合”而不是“查找”,您可以做您需要的事情。在那里您可以设置条件并转换您的数据。

db.collection.aggregate([
  {
    "$project": {
      "price": {
        "$cond": {
          "if": {
            "$eq": [
              "$price",
              0
            ]
          },
          "then": {
            "$cond": {
              "if": false,  // Here you should insert that in_person variable in your code
              "then": "$in_person_price",
              "else": "$virtual_price"
            }
          },
          "else": "$price"
        }
      },
      
    }
  }
])

【讨论】:

  • 很好,很有效。现在......之后我将如何进行查找?我尝试对其使用查询,查询的行为就好像它仍然是原始数据一样。
  • 例如,如果我使用“db.collections.aggregate(你在这里写的语法).find(price: {$lte: 40}),它仍然表现得好像价格是 0,即使它已经改变了。
  • 这不会改变原始值,只是执行一些变换操作。您可以在 te 聚合中添加 $match 操作,它将在转换后的文档上执行。只需在数组末尾添加 {$match:{price: {$lte: 40}}。
  • @IanMcInnes 我正在通过 mu 电话回答这个问题,如果您需要一个示例,我可以稍后更新主要答案。
  • @IanMcInnes 这是一个满足您要求的游乐场。 mongoplayground.net/p/I_PfdloWikG
猜你喜欢
  • 2011-04-27
  • 2023-01-15
  • 1970-01-01
相关资源
最近更新 更多