Как выполнить равенство для документов одной коллекции с помощью поиска в mongodb?

Я новичок в MongoDB, и я пытаюсь найти совпадение, но мне это не удается. У меня есть "пользовательская" коллекция, в которой есть следующие данные:

{
  uid:"1230"
  age:20
  Name:"Alex"
  gender:"male"
  interestedIn:"female"
}

{
  uid:"1231"
  age:23
  Name:"Neil"
  gender:"male"
  interestedIn:"male"
}

{
  uid:"1232"
  age:20
  Name:"Amy"
  gender:"female"
  interestedIn:"male"
}

Я хочу найти записи, «пол» которых равен «интересующемуся» текущего пользователя, и наоборот. то есть когда я обращаюсь как пользователь «Alex», тогда запрос должен предоставить мне запись только «Amy» (поскольку значение пола Эми равно значению «InterestIn» Alex), а не значение Neil. а также

Когда я получаю доступ как пользователь "Neil", никакие данные не должны возвращаться, так как нет ни одного пользователя мужского пола, который заинтересован в мужчине!

Я пытался использовать $ lookup, но он вообще не работал. И я изо всех сил пытаюсь использовать оператор $ cond для этого случая. Вот мой код:

// Я также использую геопространственные функции (путем жесткого кодирования координат), но проблема не в этом, и ничего не возвращается.

db.users.aggregate([{
"$geoNear": {
  "near": {
    type: "Point",
    coordinates: [31.9686, 99.90]
  },
  "spherical": true,
  "distanceField": "distance",
  "maxDistance": 500,
  "query": {
    uid: {
      $ne: "1230"
    },
    age: {
      $gt: 18,
      $lt: 25
    },
  {
    $lookup:
    {
      from: "users",
      localField: "gender",
      foreignField: "interestedIn",
      as: "gender_docs"
    }
  },
  limit: 5
}  
},
   {
        "$project": {
          location: 0
        }
      }
    ]).pretty()

Может кто-нибудь, дайте мне знать, как мне это сделать правильно?

// Мой ожидаемый результат, когда текущий пользователь - Alex

 {
  uid:"1232"
  age:20
  Name:"Amy"
  gender:"female"
  interestedIn:"male"
}

Мой ожидаемый результат, когда текущим пользователем является Нил, должен быть пустым, поскольку нет других записей, чей пол - мужской, а интересующий - мужской!

вы можете добавить точный ожидаемый результат?

felix 11.04.2018 13:17

Попробуйте localField: "interestedIn", foreignField: "gender"

s7vr 11.04.2018 14:08

@Veeram Ничего не происходит в оболочке mongo после того, как я попробовал ту, которую вы упомянули. Не могли бы вы помочь мне!

Code Reactor 11.04.2018 14:16

Можете ли вы просто попробовать код только с этапом поиска и посмотреть, вернет ли что-нибудь? Код поиска правильный.

s7vr 11.04.2018 14:23

@Veeram, код работает только с этапом поиска, но мне нужно использовать агрегацию, чтобы вытащить пользователей, которые находятся рядом с текущим пользователем на определенное расстояние. как мне продолжить дальше. Большое спасибо за твою помощь !

Code Reactor 11.04.2018 14:28

как получить к нему доступ как пользователь Alex? :п

Muhammad Usman 11.04.2018 14:51

как называется поле, в котором вы храните местоположение пользователей?

mikezter 11.04.2018 14:56

@Alex, у меня есть URL-адрес записи (запроса), по которой я могу получить к ней доступ как текущий пользователь ... Я хочу получить другую запись ($ ne: currentUserId), значение пола которой равно "Интересующемуся" текущего пользователя

Code Reactor 11.04.2018 15:00
0
8
103
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вам не нужны ни фреймворк агрегации, ни $lookup. Я ожидаю, что в вашем приложении есть атрибуты текущего пользователя (например, interestedIn).

Простой запрос на ваш вопрос:

db.users.find({
    "gender": currentUserInterestedIn, 
    "_id": { "$ne": currentUserID },
    "location": "$near": {
        "type": "Point",
        "coordinates": [currentUserLat, currentUserLong],
        "$maxDistance": 500    
    },
}) 

Где currentUserInterestedIn должно быть фактической стоимостью интереса текущих пользователей, то есть "male" или "female".

Предполагается, что местоположение пользователя хранится в поле с именем location.

У меня нет поля currentUserIntehibitedIn. В вашем коде отсутствовал оператор точки для значения пола? И я использую агрегирование для геопространственных запросов. Я тоже добавил ожидаемый результат!

Code Reactor 11.04.2018 13:50

Я не знаю, что вы имеете в виду под "оператором точки". Вы также можете использовать геопространственные запросы без агрегирования. Если вы хотите что-то посчитать, можно использовать агрегирование.

mikezter 11.04.2018 14:37

в вашем коде есть «пол»: currentUserIntehibitedIn, но у меня нет ключевого поля с таким именем. Я догадывался «currentUser.IntehibitedIn» ... как я могу выполнить вышеуказанный запрос без агрегирования? Разве это не повлияет на производительность db?

Code Reactor 11.04.2018 14:45

точно так же, как вы указываете координаты в приведенном выше примере запроса, вы должны поместить фактическое значение interestedIn в мой запрос вместо currentUserInterestedIn. Это просто имя-заполнитель, которое я вставил, чтобы сказать, что «здесь находится фактическое значение».

mikezter 11.04.2018 14:52

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

Code Reactor 11.04.2018 14:56

нет, это не повредит производительности. вы ничего не агрегируете.

mikezter 11.04.2018 15:23

Позвольте нам продолжить обсуждение в чате.

Code Reactor 11.04.2018 18:44

Другие вопросы по теме