如何根据mongoose中另一个文档的存在来获取doc?

时间:2016-01-14 17:29:02

标签: node.js mongodb mongoose nosql

我有一个名为post的集合,我有一个doc及其复制的doc但是在复制的doc中我们有一个不同的字段,有些doc没有复制的doc,那个情况取决于doc的数组字段,如果该字段具有user的userId,然后复制的doc将存在,否则它将不存在。

所以我想要的是如果doc数组有那个id然后得到复制的帖子,如果没有那么原始帖子

我已经进行了查询,但显示错误我使用$存在于$ cond?

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
                    }
                }

            }
  }

                           ]

2 个答案:

答案 0 :(得分:0)

你可以用这样的方式检查你的数组在boolean-expression中是否有一些值:

  1. 使用$setIntersection进行数组和值的交集。
  2. 使用$size检查该交叉点阵列的大小。
  3. 如果大小大于0,则数组中存在值。 $gt会进行此项检查。
  4. 请尝试以下代码:

    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  
          } 
        }  
       }
      }
    ])
    

答案 1 :(得分:0)

好吧最后我没有使用聚合就完成了这个。 我的查询答案是

  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
                }
            }
        }]
})