#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 .