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

我有 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。


如何解决?谢谢!


看起来您的帖子主要是代码;请添加更多细节。


红糖糍粑
浏览 209回答 1
1回答

慕尼黑的夜晚无繁华

如果要更改数组内容以根据条件添加新字段,则需要运算符,并且如果您不想限制或更改返回的文档的其余部分,则$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'来表示正在处理的数组的当前元素。在这两个示例中,这都允许重新映射数组内容,正如运算符名称所暗示的那样。
打开App,查看更多内容
随时随地看视频慕课网APP