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