MongoDB Пользовательская сортировка по двум полям - PullRequest
0 голосов
/ 08 ноября 2019

В нашем документе MongoDB у нас есть два поля: organisationId и employeeId .

Я хочу показать все элементы в коллекции, каждый из которых соответствует параметрам запроса, поэтому основное ИЛИ.

Одно условие для сортировки состоит в том, что яТребуется, чтобы документы, которые имеют оба поля, соответствующие параметрам запроса, должны появляться первыми, а затем документы, соответствующие параметру organisationName , затем.

Идея состоит в том, чтобы сначала показать данные для сотрудника (то есть вас), а затем данные вашей организации. (В наших тематических темах, предложенных вами сначала, а затем другими сотрудниками вашей организации. На данный момент я использую следующий запрос для достижения этой цели -

Campaigns.find({$and : [{'organisationName' : organisationName},{'employeeName' : userName}]},{}),
Campaigns.find({$and : [{'organisationName' : organisationName},{'employeeName' : {$ne : userName}}]},{}) 

Но это не кажется наиболее эффективнымКстати, любой другой запрос, который может сделать это всего за один вызов, был бы очень хорош, поскольку это также поможет в разбивке на страницы.

Заранее спасибо

1 Ответ

1 голос
/ 08 ноября 2019

Этот запрос агрегации получает желаемый результат:

Входные документы:

{ "org" : "o1", "emp" : "e1", "data" : "1234" }
{ "org" : "o1", "emp" : "e2", "data" : "abcd" }
{ "org" : "o1", "emp" : "b3", "data" : "xyz" }
{ "org" : "o2", "emp" : "z3", "data" : "zzz" }

Параметры запроса:

orgNameParam = "o1"
usrNameParam = "e2"

Запрос:

db.orgemp.aggregate([
  { $match: { org: orgNameParam} },
  { $facet: {
     firstQuery: [
          { $match: { emp: usrNameParam } }
     ],
     secondQuery: [
          { $addFields: { isNotEmp: { $ne: [ "$emp", usrNameParam ] } } },
          { $match: { isNotEmp: true } },
          { $project: { isNotEmp: 0 } },
          { $sort: { emp: 1 } },
     ],
  } },
  { $project: { result: { $concatArrays: [ "$firstQuery", "$secondQuery" ] } } },
])

Результат:

{
        "result" : [
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692778"),
                        "org" : "o1",
                        "emp" : "e2",
                        "data" : "abcd"
                },
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692779"),
                        "org" : "o1",
                        "emp" : "b3",
                        "data" : "xyz"
                },
                {
                        "_id" : ObjectId("5dc51432c2ac920e04692777"),
                        "org" : "o1",
                        "emp" : "e1",
                        "data" : "1234"
                }
        ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...