为了账号安全,请及时绑定邮箱和手机立即绑定

如何在嵌入数组mongodb的数组中使用$in

如何在嵌入数组mongodb的数组中使用$in

PHP
红糖糍粑 2022-01-23 10:51:54
我有 photos_comments 收藏:{    "_id" : ObjectId(""),    "photo_id" : ObjectId(""),    "content" : "Comment 1",    "is_approved" : "1",    "user" : {        "user_id" : ObjectId(""),        "name" : "",        "avatar" : ".jpg"    },    "likes" : [         {            "user_id" : ObjectId("")        }    ],    "like_count" : 1,    "reply_count" : 5,    "replies" : [         {            "reply_id" : ObjectId(""),            "content" : "Reply 1",            "is_approved" : "1",            "user" : {                "user_id" : ObjectId(""),                "name" : "",                "avatar" : ".jpg"            },            "likes" : [                 {                    "user_id" : ObjectId("")                }            ],            "like_count" : 1        },     ]}我使用 $in 检查当前用户是否喜欢回复评论:$collection->aggregate(                        [                            [                                '$match' => [                                    '_id' => new ObjectId($comment_id)                                ]                            ],                            [                                '$project' => [                                    'replies.reply_id' => 1,                                    'replies.like_count' => 1,                                    'replies.content' => 1,                                    'replies.is_liked' => ['$in' => [['user_id' => $user_id], '$replies.likes']],                                    'replies.user' => 1,                                    'replies.created_at' => 1                                ]                            ],                            ['$sort' => ["replies.reply_id" => 1]],                            ['$limit' => 5]                        ]);但是replies.is_liked 总是返回false,尽管它存在于replies 数组嵌入的likes 数组中的user_id。如何解决?谢谢!看起来您的帖子主要是代码;请添加更多细节。
查看完整描述

1 回答

?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

如果要更改数组内容以根据条件添加新字段,则需要运算符,并且如果您不想限制或更改返回的文档的其余部分,则$map可能使用:$addFields


$collection->aggregate([

  [ '$match' => [

    '_id' => new ObjectId($comment_id)

  ]],

  [ '$addFields' => [

    'replies' => [

      '$map' => [

        'input' => '$replies',

        'in' => [

          'reply_id' => '$$this.reply_id',

          'content' => '$$this.content',

          'is_approved' => '$$this.is_approved',

          'is_liked' => [ '$in' => [ $user_id, '$$this.likes.user_id' ] ],

          'like_count' => '$$this.like_count'

        ]

      ]

    ]

  ]],

  ... # any other pipeline

])

或者,$mergeObjects如果您的 MongoDB 支持并且您更喜欢,请使用:


$collection->aggregate([

  [ '$match' => [

    '_id' => new ObjectId($comment_id)

  ]],

  [ '$addFields' => [

    'replies' => [

      '$map' => [

        'input' => '$replies',

        'in' => [

          '$mergeObjects' => [

            '$$this',

            [ 'is_liked' => [ '$in' => [ $user_id, '$$this.likes.user_id'  ] ] ]

          ]

        ]        

      ]

    ]

  ]],

  ... # any other pipeline

])

当然,在这两种情况下,$user_id您的 PHP 变量在哪里是 的参数中的奇异值$in,哪里是该内部数组中值'$$this.likes.user_id'数组的 MongoDB 表示。user_id注意数组是第二个参数,单数是第一个。


$map运算符使用'$$this'来表示正在处理的数组的当前元素。在这两个示例中,这都允许重新映射数组内容,正如运算符名称所暗示的那样。


查看完整回答
反对 回复 2022-01-23
  • 1 回答
  • 0 关注
  • 208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信