Поиск по нескольким критериям в mongodb - PullRequest
0 голосов
/ 08 июня 2018

Я хочу найти любые документы, которые совпадают с input search string из таких полей, как статус, сумма, create_date, _id, валюта, а также поле firstName из коллекции Users, также мне нужно заполнить senderId и receiverId из соответствующих документов.

Это мой пример документа

{
    "_id" : ObjectId("5a6059701766d72d8872bc75"),
    "bankId" : ObjectId("5a1ff844cb8e4b304e414d51"),
    "senderId" : ObjectId("5a16ca832bedaa6c4cb4ad97"),
    "receiverId" : ObjectId("5a1f9dc3891ee80f0bb4632e"),
    "docurl" : "",
    "isSeen" : true,
    "paidOn" : ISODate("2018-01-18T08:23:12.621Z"),
    "customFees" : [],
    "existingInvoiceUrl" : "",
    "existingInvoice" : "",
    "dueDate" : "2018-01-18",
    "subTotal" : 1000,
    "amount" : 1000,
    "bank" : "ICICI",
    "notes" : "undefined",
    "status" : "pending",
    "currency" : "EURO",
    "updated_date" : ISODate("2018-01-18T08:23:12.621Z"),
    "created_date" : ISODate("2018-01-18T00:00:00.000Z"),
    "__v" : 0,
    "isAdminRead" : true
}

Я ищу эффективный способ сделать это с помощью одного запроса mongodb.Пожалуйста, помогите :)

1 Ответ

0 голосов
/ 08 июня 2018

Вы можете попробовать следующую агрегацию

Вы можете просто найти вашу строку по любому критерию, используя $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"
  }}
 ])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...