sql >> Database >  >> NoSQL >> MongoDB

Mongodb aggregatie opzoeken met voorwaarden

Allereerst is het all_category_id , niet category_id . Ten tweede koppel je geen artikelen - alle documenten hebben exact dezelfde article_category reeks. Ten slotte wilt u waarschijnlijk artikelen uitfilteren die geen overeenkomende categorie hebben. De voorwaardelijke pijplijn zou er ongeveer zo uit moeten zien:

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
    ] }
  } }
] )

UPDATE:

Als u niet overeenkomt met article_id , de $lookup zal resulteren met identieke article_category array naar alle artikelen.

Laten we zeggen uw article_category collectie heeft een ander document:

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

Met { $eq: [ "$article_id", "$$article_id" ] } in de pijplijn de resulterende article_category is

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

zonder:

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

Als het laatste is wat je nodig hebt, zou het veel eenvoudiger zijn om verzoeken te vinden:

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

en

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


  1. How-to:gebruik de Apache HBase REST-interface, deel 3

  2. Tips voor het op afstand beheren van MongoDB

  3. MongoDB-query met een 'of'-voorwaarde

  4. Iets als een tag-cache en het opvragen om ze voor te stellen met Redis