MongoDB - 在不更新的情况下获取另一个字段的值

Posted

技术标签:

【中文标题】MongoDB - 在不更新的情况下获取另一个字段的值【英文标题】:MongoDB - get another field's value without updating 【发布时间】: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。 【参考方案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

以上是关于MongoDB - 在不更新的情况下获取另一个字段的值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据另一个字段更新 mongodb 中的数组 dict 元素

如何在不指定字段名称的情况下使用 mongodb 在 nodejs 中进行部分数据搜索? [复制]

使用 Spring Data Mongodb,是不是可以在不拉取和迭代整个集合的情况下获得字段的最大值?

如何在不更新表单中所有字段的情况下进行更新

MongoDB-更新多个文档解决方案-更新文档计数器或在不存在的情况下插入

在 FaunaDB 中更新记录时,如何在不传入每个字段和子对象的情况下更新一个字段?