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中。谢谢。我正在尝试。谢谢你的详细指导。它给出了正确的结果。很抱歉反馈太晚。