Не удается найти документы при поиске по идентификатору объекта с помощью Mongoose

#mongodb #node.js #mongoose

#mongodb #node.js #mongoose

Вопрос:

   Campaign.find {client_id:req.param('client_id')}, (error, campaigns) ->
    if error
      response =
        error: error.message
    else
      for campaign in campaigns
        query =
          campaign_id: campaign._id
        console.log query
        CampaignResponse.find query, (err, campaignResponsesCount) ->
          console.log campaignResponsesCount

      response = campaigns

    res.json response
 

По какой-то причине это не возвращает результатов. Тем не менее, есть элементы CampaignResponse с этим конкретным campaign._id . Я почти уверен, что это проблема с типами и приведением, но я не могу понять, что делать.

Любая помощь?

Ответ №1:

Пара советов:

  • Попробуйте запустить тот же запрос из mongodb в командной строке, посмотрите, получите ли вы какие-либо результаты.
  • Определен ли «campaign_id» как идентификатор объекта в вашей схеме? Если это так, попробуйте выполнить поиск с использованием типа ObjectId.

Например:

 var ObjectId = require('mongoose').Types.ObjectId; 
var query = { campaign_id: new ObjectId(campaign._id) };
 

Комментарии:

1. Есть идеи, почему Мангуст вставляет, используя ObjectId, а затем не использует ObjectId при запросе?

2. Обратите внимание, что следующие операторы эквивалентны: var ObjectId = require(‘мангуст’) . Типы. ObjectId; var ObjectId = требовать(‘mongodb’). BSONPure.Идентификатор объекта;

3. «новый» может и не понадобиться; var query = { campaign_id: ObjectId(campaign._id) };

Ответ №2:

Просто чтобы улучшить предыдущий (правильный) ответ, я использую его в своих проектах :

 String.prototype.toObjectId = function() {
  var ObjectId = (require('mongoose').Types.ObjectId);
  return new ObjectId(this.toString());
};

// Every String can be casted in ObjectId now
console.log('545f489dea12346454ae793b'.toObjectId());
 

Комментарии:

1. Я бы предложил сначала проверить наличие такого метода: if (!String.prototype.toObjectId) { /* your implementation */ }

2. @Paul Rad, Где, по вашему мнению, было бы лучше всего это реализовать?

3. @JakubBarczyk Я немного опоздал, но если вы расширяете встроенные объекты, на самом деле не стоит сначала проверять их существование, если ваш скрипт не является полизаполнением , поскольку TC39 может расширить JavaScript API в будущем. Это причина, по которой Array.includes оно названо как есть, вместо более подходящего имени Array.contains : более старые версии MooTools уже добавили такое свойство Array.prototype и проверили, существовало ли оно первым. Алгоритм MooTools отличался от алгоритма spec и использовался достаточно часто, чтобы добавление версии spec нарушило большую часть интернета.

Ответ №3:

Вместо того, чтобы использовать ObjectId для поиска путем сравнения ваших параметров, просто используйте

Campaign.findById {req.param('client_id'),function(err,docs)}....

при поиске документов с использованием ObjectId findById является наиболее эффективным способом из всех…

Комментарии:

1. Это хорошо для свойства _id документа. но в примере OP запрашивается отношение — оно ищет свойство client_id .