2

有了我上一个问题的参考,我有一个关于添加一些条件的$ lookup的问题。您可以从以下链接描述中获得足够的有关问题的参考。

照片:

{_id: 1, photo_name: '1.jpg', photo_description: 'description 1', album_id: 1, flag:1 }, 
{_id: 2, photo_name: '2.jpg', photo_description: 'description 2', album_id: 1, flag:1 }, 
{_id: 3, photo_name: '3.jpg', photo_description: 'description 3', album_id: 1, flag:1 }, 
{_id: 4, photo_name: '4.jpg', photo_description: 'description 4', album_id: 2, flag:0 }, 
{_id: 5, photo_name: '5.jpg', photo_description: 'description 5', album_id: 2, flag:0 }, 
{_id: 6, photo_name: '6.jpg', photo_description: 'description 6', album_id: 2} 

专辑:

{_id: 1, album_name: "my album 1", album_description: "album description 1", emoji_id: 1}, 
{_id: 2, album_name: "my album 2", album_description: "album description 2", emoji_id: 2}, 
{_id: 3, album_name: "my album 3", album_description: "album description 3", emoji_id: 3}, 
{_id: 4, album_name: "my album 4", album_description: "album description 4", emoji_id: 4}, 
{_id: 5, album_name: "my album 5", album_description: "album description 5", emoji_id: 5} 

表情:

{_id: 1, emoji_name: "1.jpg"}, 
{_id: 2, emoji_name: "2.jpg"}, 
{_id: 3, emoji_name: "3.jpg"}, 
{_id: 4, emoji_name: "4.jpg"}, 
{_id: 5, emoji_name: "5.jpg"}, 
{_id: 6, emoji_name: "6.jpg"}, 
{_id: 7, emoji_name: "7.jpg"}, 
{_id: 8, emoji_name: "8.jpg"} 

测试记录分页:

2

假设我在照片集合中添加了另一个标志字段,现在我只想计算标志为1的那些照片。

我试图在查询中的$查找后立即添加$匹配,但它失败,它不排除标志为0的照片,并且在计数器中它也不会标记条件。

本次输出 有3张照片出来的10张照片将其具有标志0。而且我们不能认为这些照片,其标志为0,所以预计总数为7张照片,但数返回10张照片,虽然我申请的条件国旗在照片中。

当前查询:

db 
.album 
.aggregate([ 
    { 
    $lookup:{ 
     from:"photo", 
     localField:"_id", 
     foreignField:"album_id", 
     as:"photo" 
    } 
    }, 
    { 
    $match:{ 
     "photo.flag": 1 
    } 
    }, 
    { 
    $lookup:{ 
     from:"emoji", 
     localField:"album_emoji", 
     foreignField:"_id", 
     as:"emoji" 
    } 
    }, 
    { 
    $project:{ 
     album_name:"$album_name", 
     album_description:"$album_description", 
     album_emoji:"$emoji.image_name", 
     photo:"$photo", 
     total_photos: {$size: "$photo"} 
    } 
    } 
]) 
.toArray(); 

预期输出:

[ 
    { 
     "_id" : 1, 
     "album_name" : "Album 1", 
     "album_description" : "Album description 1", 
     "album_emoji" : [ 
      "1.jpg" 
     ], 
     "total_photos" : 3, 
     "photo" : [ 
      { 
       "_id" : 1, 
       "album_id" : 1, 
       "photo_description" : "description 1", 
       "photo_name" : "1.jpg",    
       "flag" : 0, 
      }, 
      { 
       "_id" : 2, 
       "album_id" : 1, 
       "photo_description" : "description 2", 
       "photo_name" : "2.jpg",    
       "flag" : 0, 
      }, 
      { 
       "_id" : 1, 
       "album_id" : 1, 
       "photo_description" : "description 3", 
       "photo_name" : "3.jpg",    
       "flag" : 0, 
      } 
     ] 
    } 
] 

当前输出:

[ 
    { 
     "_id" : 1, 
     "album_name" : "Album 1", 
     "album_description" : "Album description 1", 
     "album_emoji" : [ 
      "1.jpg" 
     ], 
     "total_photos" : 5, 
     "photo" : [ 
      { 
       "_id" : 1, 
       "album_id" : 1, 
       "photo_description" : "description 1", 
       "photo_name" : "1.jpg",    
       "flag" : 1, 
      }, 
      { 
       "_id" : 2, 
       "album_id" : 1, 
       "photo_description" : "description 2", 
       "photo_name" : "2.jpg",    
       "flag" : 1, 
      }, 
      { 
       "_id" : 3, 
       "album_id" : 1, 
       "photo_description" : "description 3", 
       "photo_name" : "3.jpg",    
       "flag" : 1, 
      }, 
      { 
       "_id" : 4, 
       "album_id" : 1, 
       "photo_description" : "description 4", 
       "photo_name" : "4.jpg",    
       "flag" : 0, 
      }, 
      { 
       "_id" : 5, 
       "album_id" : 1, 
       "photo_description" : "description 5", 
       "photo_name" : "5.jpg",    
       "flag" : 0, 
      } 
     ] 
    } 
] 
+0

它确实排除了“photo.flag”为0的照片。你在使用MongoDB 3.2吗? – notionquest

+0

是的,我正在使用mongoDB 3.2 –

+0

@notionquest:是的我使用MongoDB3.2,也是这个查询工作我..但对我来说,它不排除recods,并没有给出总的照片计数器的正确结果。 –

回答

1

“$ lookup”后面的对象方法不能使用“$ match”,因为“$ lookup”的返回值是数组值。查找之后,最好添加“$ unwind”功能,然后对其进行分组。

实例查询

db 
.album 
.aggregate([ 
    { 
     $lookup:{ 
      from:"photo", 
      localField:"_id", 
      foreignField:"album_id", 
      as:"photo" 
     } 
    }, 
    { 
     preserveNullAndEmptyArrays : true, 
     path : "$photo" 
    }, 
    { 
     $match:{ 
      "photo.flag": 1 
     } 
    }, 
    { 
     $group : { 
      _id : { 
       id : "$_id", 
       album_name: "$album_name", 
       album_description: "$album_description", 
       emoji_id: "$emoji_id" 
      }, 
      photo: { 
       $push : "$photo" 
      } 
     } 
    } 
    { 
     $lookup:{ 
      from:"emoji", 
      localField:"_id.album_emoji", 
      foreignField:"_id", 
      as:"emoji" 
     } 
    }, 
    { 
     $project:{ 
      album_name:"$album_name", 
      album_description:"$album_description", 
      emoji:"$emoji", 
      photo:"$photo", 
      total_photos: {$size: "$photo"} 
     } 
    } 
]) 

;或用 “$过滤器”。

db 
.album 
.aggregate([ 
    { 
     $lookup:{ 
      from:"photo", 
      localField:"_id", 
      foreignField:"album_id", 
      as:"photo" 
     } 
    }, 
    { 
     $project: { 
      id : "$_id", 
      album_name: "$album_name", 
      album_description: "$album_description", 
      emoji_id: "$emoji_id", 
      photo: { 
       $filter : { 
        input: "$photo", 
        as : "photo_field", 
        cond : { 
         $eq: ["$$photo_field.flag",1] 
        } 
       } 
      } 
     } 
    }, 
    { 
     $lookup:{ 
      from:"emoji", 
      localField:"album_emoji", 
      foreignField:"_id", 
      as:"emoji" 
     } 
    }, 
    { 
     $project:{ 
      album_name:"$album_name", 
      album_description:"$album_description", 
      emoji:"$emoji", 
      photo:"$photo", 
      total_photos: {$size: "$photo"} 
     } 
    } 
]) 
+0

您在第二阶段缺少'$ unwind'定义。 –