Intereting Posts
Зарегистрировать сборщики ручек Создавать объект «на лету» из CSV Одиночная резьбовая петля событий против многопоточного неблокирующего работника в Node.JS Как использовать эмитент Flux и событий с .net MVC? MongoDB импорт / экспорт с использованием Node.js Отправить данные от бота к клиенту в DirectLine WebChat – NodeJS Botframework Кордова: Невозможно добавить платформу Android, получив EACCES Error nodejs imagemagick конвертирование svg в png добавляет белый фон, как сохранить его прозрачным? Пользовательская функция конструктора в схеме / моделях Mongoose Я хочу отправить данные от многих клиентов одному стабильному клиенту, используя Node.js Как проверить локальные функции aws lambda Vuex & Websockets Как минимизировать приложение node.js? (На стороне сервера node.js, а не на стороне клиента javascript) Mongo и Node.js: поиск документа с помощью _id с использованием UUID (GUID) Как передавать / передавать большие данные из дочерних процессов в node.js без использования блокировки stdio?

Поиск встроенного документа по определенному свойству в Mongoose, Node.js, MongodDB

Для этого приложения я использую Node.js, MongoDB, Mongoose & Express

Поэтому у меня есть объект Param, содержащий массив Pivots, и я хочу прочитать определенные данные из опорных точек, как показано ниже

---in models.js------------------------- var Pivot = new Schema({ value : String , destination : String , counter : Number }); var Param = new Schema({ title : String , desc : String , pivots : [Pivot] }); ------------- in main.js -------------- var Param = db.model('Param'); app.get('/:title/:value', function(req, res){ Param.findOne({"title":req.param('title')}, function(err, record){ console.log(record.pivots); record.pivots.find({"value":req.param('value')}, function(err, m_pivot){ pivot.counter++; res.redirect(m_pivot.destination); }); record.save(); }); }); 

Я знаю, что код работает до console.log (record.pivots), так как я получил коллекцию документов с правильными сводными документами внутри.

Тем не менее, похоже, что метод find не позволяет мне сопоставить внедренный документ с помощью свойства value, определенного в схеме. Можно ли просматривать этот массив встроенных документов с помощью .find () или .findOne (), а если нет, есть ли простой способ получить к нему доступ через мангуст?

varunsrin,

Это должно сделать это

 app.get('/:title/:value', function(req, res) { Param.findOne({'pivots.value': req.param('value'), "title":req.param('title')}}, function(err, record) { record.pivot.counter++; res.redirect(m_pivot.destination); record.save(); }); }); 

Обратите внимание на плюрализацию запроса для соответствия имени поля в вашей схеме

Вы можете запросить использование встроенных свойств документа следующим образом:

 {'pivot.value': req.param('value')}} 

Обновление в ответ на комментарий:

 app.get('/:title/:value', function(req, res) { Param.findOne({'pivot.value': req.param('value'), "title":req.param('title')}}, function(err, record) { record.pivot.counter++; res.redirect(m_pivot.destination); record.save(); }); }); 

Я решил временно использовать простой цикл для анализа массива объектов следующим образом:

 for (var i=0; i  

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

Если у кого-нибудь есть предложения по более быстрому поиску этого массива объектов либо в js, либо в функции mongoose, пожалуйста, напишите ниже.

самая большая проблема заключается в том, что если ваш req имеет некоторые поля пустым (это должно действовать как подстановочный знак), вы ничего не найдете, так как монго пытается найти и пустые параметры, поэтому поиск {“user”: “bob”, ” color “:” “} не совпадает с {” user “:” bob “,” color “:” red “} или {” user “:” bob “}. это означает, что вы должны сначала создать объект запроса и отфильтровать любые неиспользуемые параметры, прежде чем передать его, и если вы создадите объект запроса, вы больше не сможете делать что-то вроде «user.name = …», поскольку mongo interperets это как ошибка, так как она сначала не разрешает литерал объекта в строку. Любые идеи по этой проблеме?

пс. Вы могли бы подумать, что будет достаточно легко создать такой объект: user.name = “bob”; user.color: “зеленый”; user.signup.time = “12342561”, а затем просто используйте пользователя в качестве объекта запроса: /

Я думаю, что вы ищете ключевое слово «$ in»?

Как в:

 {a: {$in: [10, "hello"]}} 

источник: MongoDB Запросы CheatSheet