Не удается найти документы с помощью ObjectId, используя Mongoose - PullRequest
56 голосов
/ 24 октября 2011
  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.Я почти уверен, что это проблема с типами и приведением типов, но я не могу понять, что делать.

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

Ответы [ 3 ]

126 голосов
/ 25 октября 2011

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

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

Например:

var ObjectId = require('mongoose').Types.ObjectId; 
var query = { campaign_id: new ObjectId(campaign._id) };
39 голосов
/ 10 ноября 2014

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

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());
8 голосов
/ 23 декабря 2016

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

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

, когда поиск документов с использованием objectId findById - самый эффективный способ из всех ...

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