【问题标题】:Having trouble with mongoDB projection with condition有条件的 mongoDB 投影有问题
【发布时间】:2020-11-21 20:36:01
【问题描述】:

假设我在另一个名为“Collection1”的集合中有以下数据

userID: "1"
container:[
    {"item" : "false", "price" : NumberDecimal("80"), "sizes" : "S", "arrayIndex" : NumberLong(0) }
    {"item" : "false", "price" : NumberDecimal("80"), "sizes" : "M", "arrayIndex" : NumberLong(1) }
    {"item" : "true", "price" : NumberDecimal("80"), "sizes" : "L", "arrayIndex" : NumberLong(2) }
]

我将“Collection1”加入到我的主要查询中,如下所示(在联合之前有很多事情要做,我想简化一下)

    {$lookup:{
        from:'Collection1',
  localField:'result',
foreignField:'userID',
          as:'photos'
    }},

    {$unwind:{
        path:'$photos',
        preserveNullAndEmptyArrays:true
    }},

到目前为止,一切都很好,直到我做一个项目。

{$project:
   {'photo':
   {$cond:{
      if:{$eq:['$photos.container.item',false]},
      then:'$photos.container.price',
      else:null
       }
    }
 }},

在没有条件的情况下投影任何元素都有效。但是,我也在做另一种情况的投影,那里没有问题。

预期的输出是

[
 {
   otherElement:....
   photos:{
     price:80
   }
 }
]

谁能告诉我为什么这不起作用。再次,我很抱歉我不得不以某种方式简化它。如果不清楚,我可以尝试使其更易于理解。

【问题讨论】:

  • @varman 好的,我更改了脚本,我相信这次它不应该工作,因为它在一个数组中?能否请你确认?谢谢你看这个顺便说一句。
  • 当您发布问题时,请仔细检查您是否包含了其他人理解的所有内容。请发布一些示例数据(两个集合)
  • @PatrickAdjei 您的预期结果是什么?你能补充你的问题吗?
  • @verman 请说明您需要什么。我很乐意提供。问题一开始提供的数据还不够吗?我尽量保持简短。

标签: javascript node.js mongodb mongoose mongodb-query


【解决方案1】:

您的容器字段是一个数组,因此这样做 $eq:['$photos.container.item',false] 将无法直接工作,您需要先展开 container 以将其转换为如下所示的对象。

  {
    $unwind: {
      path: "$photos.container",
      preserveNullAndEmptyArrays: true
    }
  },

这是工作示例MongoDB Playground

【讨论】:

  • 它不会展开容器。我已经尝试过了,我只是再次确认。
【解决方案2】:

在我的情况下,不应该展开数组。相反,我应该使用条件进行投影和过滤。

{$project:
   {'photos':
      {$filter:
         {
         input:'$photos.container',
         as:'photo',
         cond:{
             $eq:['$$photo.profilePic',true]
              }
         }
    }
}}

非常感谢你们看这个。我很感激!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2018-06-23
    • 2017-07-30
    • 2020-07-26
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多