Search code examples
node.jsdatabasemongodbmongoose

Query in current document and sub document mongodb


I have two collections Orders and Books , I want to query on Order (code) and Book ( name, number) same time with a string value, to check if any of these three value matches with string and return those Orders documents

Orders :{   
_id: 6456353b9bdc3f78e546e557,  
code: '12344,   
bookId: 645635649bdc3f78e546e560  
}
Books :{   
_id :645635649bdc3f78e546e560,    
name: "golden",  
number: "12321"   
}

Response I want

{
_id: 6456353b9bdc3f78e546e557,    
code: '12344',    
bookId: {   
   _id :645635649bdc3f78e546e560,   
   name: "golden",   
   number: "12321"   
  }  
}

I have tried this query but it is not returning result for order (code)

Order.aggregate([     
        {         
          $lookup: {       
            from: 'books',               
            localField: 'bookId',                 
            foreignField: '_id',                
            pipeline: [{                        
               $match: {          
                  $or: [                 
                    { code: { $regex: new RegExp(search, 'i') } },         
                    { name: { $regex: new RegExp(search, 'i') } },            
                    { number: { $regex: new RegExp(search, 'i') } },          
                  ],         
                },        
              },        
            ],          
            as: 'bookId',       
          },       
        },           
        { $unwind: '$bookId' },     
      }  

])

Solution

  • This worked for me.

        Orders.aggregate([     
            {         
              $lookup: {       
                from: 'books',               
                localField: 'bookId',                 
                foreignField: '_id',                         
                as: 'bookId',       
              },       
            },           
            { $unwind: '$bookId' },     
            {            
              $match: {          
                      $or: [                 
                        { code: { $regex: new RegExp(search, 'i') } },         
                        { 'bookId.name': { $regex: new RegExp(search, 'i') } },            
                        { 'bookId.number': { $regex: new RegExp(search, 'i') } },          
                      ],         
                    },        
              }
          }
    ])