具有条件的Mongodb聚合查找

vietnguyen09

我有一个称为的集合article_category,其中所有存储都article_id属于category_id此类其数据格式如下。

集合1:article_category

{
  "article_id": 2015110920343902,
  "all_category_id": [5,8,10]
}

然后我有另一个收藏集叫做article存储所有帖子

收藏2:文章

{
  "title": "This is example rows in article collection"
  "article_id": 2015110920343902,
},
{
  "title": "Something change"
  "article_id": 2015110920343903,
},
{
  "title": "This is another rows",
  "article_id": 2015110920343904,
}

现在,我想执行的MongoDB查询发现titleregex同时category_id必须等于8这是我的查询,但不起作用。

db.article.aggregate(
{
  $match: 
  {
    title: 
    {
       $regex: /example/
    }
  }
},
{
    $lookup:
       {
         from: "article_category",
         pipeline: [
            { $match: { category_id: 8 } }
         ],
         as: "article_category"
       }
  }
)

上面的查询仅显示匹配regex但不匹配的记录category_id

任何的想法?

亚历克斯·布莱克斯

首先all_category_id,不是category_id其次,您不链接文章-所有文档将具有完全相同的article_category数组。最后,您可能希望过滤出类别不匹配的文章。条件管道应如下所示:

db.article.aggregate([
  { $match: {
      title: { $regex: /example/ }
  } },
  { $lookup: {
    from: "article_category",
    let: {
      article_id: "$article_id"
    },
    pipeline: [
      { $match: {
          $expr: { $and: [
              { $in: [ 8, "$all_category_id" ] },
              { $eq: [ "$article_id", "$$article_id" ] }
          ] }
      } }
    ],
    as: "article_category"
  } },
  { $match: {
    $expr: { $gt: [
      { $size: "$article_category"},
      0
    ] }
  } }
] )

更新:

如果不匹配article_id$lookup结果将与article_category所有文章的数组相同

假设您的article_category收藏有另一个文档:

{
  "article_id": 0,
  "all_category_id": [5,8,10]
}

随着{ $eq: [ "$article_id", "$$article_id" ] }管道的结果article_category

[ 
  { 
    "article_id" : 2015110920343902, 
    "all_category_id" : [ 5, 8, 10 ] 
  } 
]

没有:

[ 
  { 
    "article_id" : 2015110920343902, 
    "all_category_id" : [ 5, 8, 10 ] 
  },
  {
    "article_id": 0,
    "all_category_id": [ 5, 8, 10 ]
  }
]

如果您需要后者,则查找请求将更简单:

db.article.find({ title: { $regex: /example/ } })

db.article_category.find({ all_category_id: 8 })

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章