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

Php 如何在嵌入数组mongodb的数组中使用$in,php,mongodb,mongodb-query,Php,Mongodb,Mongodb Query,我收集了照片和评论: { "_id" : ObjectId(""), "photo_id" : ObjectId(""), "content" : "Comment 1", "is_approved" : "1", "user" : { "user_id" : ObjectId(""), "name" : "", "avatar" : ".jpg" }, "likes" : [

我收集了照片和评论:

{
    "_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]
                        ]);
但是repries.is_liked始终返回false,尽管它存在于repries数组嵌入的likes数组中的user_id

如何修复它?谢谢


看起来你的帖子大部分都是代码;请添加更多详细信息。

如果要根据条件更改数组内容以添加新字段,则需要操作员,如果不想限制或更改返回的文档的其余部分,则可能需要使用:

$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
])
或者,如果您的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\u id
是PHP变量,作为参数中的单数值,而
'$$this.likes.user\u id'
是该内部数组中
user\u id
值数组的MongoDB表示形式。注意数组是第二个参数,单数是第一个参数


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

您实际期望的结果是什么?展示你的预期结果。请注意,文档中显示的
回复
是一个数组,因此
$project
阶段中简单的“点符号”不足以改变每个数组元素。如果希望更改所有数组元素,则必须使用@NeilLunn I want return list replies with replies.is_liked=true,如果当前用户id存在于likes replies数组embed中。谢谢。我正在尝试。谢谢你的详细指导。它给出了正确的结果。很抱歉反馈太晚。