【问题标题】:How to fetch doc on basis of the existence of another document in mongoose?如何根据猫鼬中另一个文档的存在来获取文档?
【发布时间】:2016-04-20 03:43:39
【问题描述】:

我有一个名为 post 的集合,我有一个文档及其复制的文档,但在复制的文档中,我们有一个不同的字段,一些文档没有复制的文档,这种情况取决于文档的数组字段,如果该字段具有用户的 userId,则复制的文档将存在,否则它将不存在。

如果 doc 数组具有该 id 则我想要什么,然后获取复制的帖子,如果没有,则获取原始帖子

我进行了查询,但显示错误我在 $cond 中使用 $exist ?

Post.aggregate([
        {
            $match: {
                socomo_visibility: socomoId
            }
        },
        {
            $project: {
                "post_stream_type": {
                    $cond: {
                        if: {
                            'following_users_list': {
                                $exist: [userId]
                            }

                        },
                        then: constants.POST_STREAM_TYPE.FOLLOW.value,
                        else: constants.POST_STREAM_TYPE.SOCIAL_CURRY_CHANNEL.value
                    }
                }

            }
  }

                           ]

【问题讨论】:

    标签: node.js mongodb mongoose nosql


    【解决方案1】:

    好吧,我终于在不使用聚合的情况下完成了这项工作。 我对查询的回答是

      Post.find({
        $or: [{
                socomo_visibility: {
                    $elemMatch: {
                        $eq: socomoId
                    }
                },
                post_stream_type: constants.POST_STREAM_TYPE.SOCIAL_CURRY_CHANNEL.value,
                following_users_list: {
                    $exists: true,
                    $nin: [userId]
                }
            },
            {
                socomo_visibility: {
                    $elemMatch: {
                        $eq: socomoId
                    }
                },
                post_stream_type: constants.POST_STREAM_TYPE.FOLLOW.value,
                following_users_list: {
                    $elemMatch: {
                        $eq: userId
                    }
                }
            }]
    })
    

    【讨论】:

      【解决方案2】:

      您可以通过以下方式检查您的数组是否在布尔表达式中具有某些值:

      1. 使用$setIntersection做数组值的交集。
      2. 使用$size 检查该交集数组的大小。
      3. 如果大小大于 0,则数组中存在值。 $gt 将进行此项检查。

      试试下面的代码:

      Post.aggregate([
        {
         $project: { 
          "post_stream_type": {
            $cond: { 
              if: {$gt: [{$size: {$setIntersection: ["$following_users_list", [userId]] } }, 0] }, 
              then: constants.POST_STREAM_TYPE.FOLLOW.value, 
              else: constants.POST_STREAM_TYPE.SOCIAL_CURRY_CHANNEL.value  
            } 
          }  
         }
        }
      ])
      

      【讨论】:

      • 感谢您的努力。我已经尝试过了,但它返回了所有数据 _id 和 post_stream_name 的两个字段。我想如果原始文档数组具有 userId 然后获取该 parent_id 的 post_stream_type:POST_STREAM_TYPE.FOLLOW.value 否则获取该父 ID 的原始值 .parent_id 对于原始和复制都是相同的,但它们的 stream_type 是不同的。
      猜你喜欢
      • 2022-12-23
      • 2022-01-10
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      相关资源
      最近更新 更多