Вы можете попробовать следующую агрегацию
Вы можете просто найти вашу строку по любому критерию, используя $match
с $or
... Затем вам нужно сделать $lookup
для заполненияВаше поле в нужной коллекции ... И если вы хотите, чтобы отправитель и получатель использовались как объект, тогда используйте $unwind
stage в конце конвейера ... Здесь для created_date
вы можете использовать $lte
$gte
также ...
Во-первых, вам нужно проверить, является ли строка действительной objectId
или нет
var mongodb = require("mongodb"),
objectid = mongodb.BSONPure.ObjectID;
const myMatch = []
const myArray = [
{ "status": { "$regex": "your_string" }},
{ "amount": { "$regex": "your_string" }},
{ "created_date": : "your_string" },
{ "currency": { "$regex": "your_string" }},
{ "firstName": { "$regex": "your_string" }}
]
if (objectid.isValid("your_string")) {
myArray.push({ "_id": : mongoose.Types.ObjectId("your_string") })
}
Если у вас mongodb версия 3.6
db.collection.aggregate([
{ "$match": { "$or": myArray } },
{ "$lookup": {
"from": Sender.collection.name,
"let": { "senderId": "$senderId" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$senderId" ] } } }
],
"as": "sender"
}},
{ "$lookup": {
"from": Receiver.collection.name,
"let": { "receiverId": "$receiverId" },
"pipeline": [
{ "$match": { "$expr": { "$eq": [ "$_id", "$$receiverId" ] } } }
],
"as": "receiver"
}}
])
и если у вас есть версия mongodb до 3.6
db.collection.aggregate([
{ "$match": { "$or": myArray } },
{ "$lookup": {
"from": Sender.collection.name,
"localField": "senderId",
"foreignField": "_id",
"as": "sender"
}},
{ "$lookup": {
"from": Receiver.collection.name,
"localField": "receiverId",
"foreignField": "_id",
"as": "receiver"
}}
])