2013-02-21 6 views
3

Возвращаясь к вашей помощи снова, надеюсь, для этого проекта, ответ на то, что у меня здесь, будет последним. Я видел, что это довольно часто задаваемый вопрос, но я пробовал советы на другом Stack Overflow post, а один на Google Group, но решения не сработали для меня.Схема запроса Mongoose от ObjectId

Мой код является немного как:

mongoose = require('mongoose'); 
Schema = mongoose.Schema; 
mongoose.connect(MONGO_SERVER); 
ObjectId = Schema.ObjectId; 

var RacesSchema = new Schema({ 
    venue_id  : { type: mongoose.Schema.ObjectId, ref: 'Venues' }, 
    racetype   : String 
}); 
var races = mongoose.model('Races', RacesSchema); 

function test() { 
    var MyObjectId = require('mongoose').Types.ObjectId; 
    queryVenue = new MyObjectId("50e3dcdbf30375180c078f64"); 

    races.find({venue_id: queryVenue, racetype:'Test'}) 
    .exec(function(err,data) { 
} 

test(); 

Но я не получаю результатов, которые я знаю, что есть.

Большое спасибо заранее!

UPDATE

свели к минимуму выше пример кода, этот тест работает, если я запрашиваю значение строки по себе, просто запрашивая для ObjectId, где он выходит из строя, и я знаю, что он существует.

JSON UPDATE

Вот что я ищу:

{ 
    "_id" : ObjectId("50e3dcddf30375180c078f85"), 
    "venue_id" : "50e3dcdbf30375180c078f64", 
    "racetype" : "A" 
} 

И вдруг, я считаю, что мой ответ стал для меня ясно. Это просто потому, что event_id на самом деле является строкой? И если да, могу ли я сохранить схему моего мангуста так, как она есть, и делать кастинг по запросу в точке нахождения находок строки? Или я должен изменить способ сохранения этих значений (из отдельного приложения .NET, которое я разработал) для вставки в ObjectId?

В настоящее время прямо сейчас для другого запроса текущая схема мангуста и способ [фактическая настройка базы данных] с использованием функции populate() работают достаточно хорошо, чтобы заполнить результаты ссылочной таблицы (place_id) тем, как эта модель в настоящее время настроено, только разница по вышеуказанному запросу, я не указываю место встречи ...

Спасибо.

+0

Что такое obj.venue_id? –

+0

Можете ли вы предоставить минимальный пример, который воспроизводит проблему? Без документов и значения 'obj.venue_id', которые вы используете, это будет трудно помочь. – JohnnyHK

+0

Можете ли вы также показать JSON для документа, который вы пытаетесь найти? – JohnnyHK

ответ

2

Правильно, проблема возникает из-за того, что тип данных venue_id в схеме (ObjectId) не соответствует таковой в документе (String). Таким образом, find ищет значения ObjectId, но не находит совпадение, потому что это строка в документе.

Правильное исправление для этого состоит в том, чтобы написать небольшую программу для обновления значений venue_id в ваших документах как ObjectIds вместо строк, а затем ваш запрос будет работать. Это также уменьшит размер этих полей с 24 байт до 12.

+0

Большое спасибо Джонни :) Все отлично работает сейчас. – Jester

+0

Чтобы добавить к этому, я считаю, что когда схема mongoose указывает тип значения как 'Schema.Types.ObjectId', тогда он будет выдавать строку как этот тип, когда запрос действительно выполняется. –

Смежные вопросы