sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $lookup pipeline match av _id fungerar inte

Jag hade också problem när jag använde $lookup med mongoose för att försöka matcha _id eftersom min samling lagrar referensen som en String och inte ett ObjectId

Modell A:{_id:ObjectId("xxx"), b_id:"eeeee"}

Modell B:{_id:ObjectId("eeeee")}

MyCollectionA.aggregate([
   {
      $lookup: {
        from: "collectionb",
        let: {id: "$b_id"},
        pipeline: [{$match: {$expr: {$eq: ["$_id", "$$id"]}}}],
        as: b
      }
])

I det här exemplet fylls b aldrig eftersom $$id inte betraktas som ett ObjectId

Lägg bara till ett projekt för att transformera $$id till ett objekt-ID och dess funktion

MyCollectionA.aggregate([
   {
      $lookup: {
        from: "collectionb",
        let: {id: "$b_id"},
        pipeline: [
           {$project: {_id: 1, bid: {"$toObjectId": "$$id"}}},
           {$match: {$expr: {$eq: ["$_id", "$bid"]}}}
        ],
        as: b
      }
])

Eller med foreignField, localField:

MyCollectionA.aggregate([
   {
      $project:{
        _id: 1,
        b_id: {"$toObjectId": "$b_id"}
      }
   },
   {
      $lookup: {
        from: "collectionb",
        localField: "b_id",
        foreignField: "_id",
        as: b
      }
])


  1. Iterera över stor samling i MongoDB via vårdata

  2. Konvertera HBase ACL:er till Ranger-policyer

  3. Aggregationspipeline och index

  4. Det går inte att låsa ett mongodb-dokument. Vad händer om jag behöver?