Как использовать $ in в массиве embed array mongodb - PullRequest
1 голос
/ 21 сентября 2019

У меня есть коллекция 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, хотя и существуетuser_id в массиве лайков из встраиваемого массива ответов.

Как это исправить?Спасибо!

Похоже, ваш пост в основном состоит из кода;пожалуйста, добавьте больше деталей.

1 Ответ

3 голосов
/ 21 сентября 2019

Если вы хотите изменить содержимое массива, чтобы добавить новое поле на основе условия, тогда вам нужен оператор $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 значений в этом внутреннем массиве.Обратите внимание, что массив - это аргумент second , а единственное число - это first .

* 1035Оператор * использует '$$this' для представления текущего элемента обрабатываемого массива.В обоих примерах это позволяет переотображать содержимого массива, как и следует из имени оператора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...