Сравните mongoose ObjectId в узле js [дубликат]

Попробуйте мое решение из https://stackoverflow.com/a/40778162/2571249

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

   bottomNavigationView.setOnNavigationItemSelectedListener(this);
   Menu menu = bottomNavigationView.getMenu();
   this.onNavigationItemSelected(menu.findItem(R.id.action_favorites));
}

55
задан shargors 24 April 2013 в 20:32
поделиться

2 ответа

[edit на основе этого теперь возможно в последних версиях]

[Обновленный ответ] Вы можете запросить следующий способ вернуть имя класса и идентификатор студента, только если они уже зарегистрированы.

db.student.find({},
 {_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})

, и вы вернете то, что ожидали:

{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }

[Исходный ответ] В настоящее время невозможно сделать то, что вы хотите сделать. Это несчастливо, потому что вы могли бы это сделать, если бы ученик был сохранен в массиве как объект. На самом деле, я немного удивлен, что вы используете только ObjectId (), так как всегда требует от вас поискать учеников, если вы хотите отобразить список студентов, обучающихся по определенному курсу (смотрите (1) Если вы сохранили (в качестве примера) идентификатор и имя в массиве курсов, например:

g5]

{
        "_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
        "name" : "Physics",
        "students" : [
                {id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
                {id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
        ]
}

Тогда ваш запрос будет просто:

db.course.find( { }, 
                { students : 
                    { $elemMatch : 
                       { id : ObjectId("51780f796ec4051a536015d0"), 
                         name : "Sam" 
                       } 
                    } 
                } 
);

Если этот ученик был зарегистрирован только в CS 101, вы вернетесь:

{ "name" : "Literature" }
{ "name" : "Physics" }
{
    "name" : "CS 101",
    "students" : [
        {
            "id" : ObjectId("51780f796ec4051a536015cf"),
            "name" : "John"
        }
    ]
}
55
ответ дан Asya Kamsky 22 August 2018 в 10:42
поделиться
  • 1
    Спасибо, что подтвердили мои мысли о невозможности запроса простых массивов, а также массивов поддокументов. Думаю, мне придется переоценить мою схему. Вы знаете, планирует ли 10Gen решить эту проблему? – shargors 25 April 2013 в 14:52
  • 2
    Я не смог найти билет Jira для этого на jira.mongodb.org, и ничто не запланировано на выпуск без билета, поэтому я бы сказал, что не скоро. – Asya Kamsky 25 April 2013 в 15:51
  • 3
    Как насчет использования $ all, как описано в stackoverflow.com/questions/8145523/… – Xerri 2 December 2013 в 18:37
  • 4
    $ all - оператор для запросов - запрос не является проблемой, проблема возвращается, поэтому мы обсуждаем операторы проектирования. – Asya Kamsky 3 December 2013 в 05:17
  • 5
    Проблема с хранением имени и объекта в коллекции course заключается в том, что у вас есть имя ученика, хранящееся в нескольких местах, что может потенциально выйти из синхронизации. В этом случае ваш запрос вернет неполные данные. Если загрузка сервера и аппаратное обеспечение не очень растянуты, может потребоваться дополнительный запрос для получения имени. Вы все равно можете сохранить ученика ObjectId s как объект, чтобы разрешить запрос OP: {"id":...} – drevicko 14 March 2014 в 03:40

Кажется, что оператор $in отлично выполнит ваши цели.

Вы могли бы сделать что-то вроде этого (псевдо-запрос):

if (db.courses.find({"students" : {"$in" : [studentId]}, "course" : courseId }).count() > 0) {
  // student is enrolled in class
}

В качестве альтернативы вы можете удалить предложение "course" : courseId и вернуть набор всех классов, в которые учащийся участвовал.

18
ответ дан xbonez 22 August 2018 в 10:42
поделиться
  • 1
    Проблема с этим подходом заключается в том, что он вернет документ из коллекции курсов только в том случае, если студент зарегистрировался на курс. Если студент не зарегистрировался, потребуется второй запрос. Это неэффективно. – shargors 24 April 2013 в 18:45
  • 2
    Второй запрос должен был бы получить идентификатор объекта студента? Но не будет ли это уже известно (в конце концов, вы используете его для создания первого запроса). – xbonez 24 April 2013 в 19:00
  • 3
    Конечной целью является получение документа курса и наличие флага для указания, зарегистрирован ли для него ученик. Запрос, который вы предоставили, будет извлекать документ курса только в том случае, если ученик зарегистрировался для него. Если студент не зарегистрировался для курса, для получения документа курса требуется другой запрос. – shargors 24 April 2013 в 19:56
  • 4
    Я не думаю, что что-то не так с моделью данных. Я подозреваю, что нет реального способа добиться того, чего вы хотите, без двух запросов, потому что в конце дня вы задаете вашей базе данных два вопроса: дайте мне документ курса И является студентом, зачисленным в курс. Даже в традиционной реляционной базе данных вы столкнулись бы с одной и той же проблемой. – xbonez 24 April 2013 в 22:19
  • 5
    Поздний ответ (извините!), Но нет, что никогда не было целью Монго. Mongo должен хранить нереляционные, объективные объекты данных. AFAIK, он не пытается уменьшить количество требуемых запросов. – xbonez 27 October 2014 в 19:26
Другие вопросы по тегам:

Похожие вопросы: