Поиск встроенного документа по определенному свойству в Mongoose, Node.js, MongodDB - PullRequest
6 голосов
/ 25 апреля 2011

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

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

---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 (), и если нет, есть ли какой-нибудь простой способ получить к нему доступ через mongoose?

Ответы [ 5 ]

3 голосов
/ 09 мая 2011

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();
               });
});

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

1 голос
/ 27 апреля 2011

Вы можете делать запросы, используя встроенные свойства документа, такие как:

{'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();
               });
});
0 голосов
/ 01 июня 2015

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

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

0 голосов
/ 26 апреля 2011

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

for (var i=0; i <record.pivots.length; i++){
   if (record.pivots[i].value == req.param('value')){
      res.redirect(record.pivots.destination);
   } 
}

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

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

0 голосов
/ 25 апреля 2011

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

Как в:

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

источник: Чек-лист запросов MongoDB

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...