2013-09-11 2 views
2

Как я могу выполнить этот запрос в Mongoose.js + MongoDB?Запросить вложенные объекты динамически в Mongodb + Mongoose.js

У меня простая схема, где оценки хранятся по идентификатору пользователя, чтобы избежать дублирования. Для чтения и записи данных объектов это прекрасно работает. Но как я могу запросить MongoDB для всех элементов, на которые его оценил конкретный зритель?

Например, это работает отлично в MongoDB оболочки:

db.items.find({ratings.52126672b9f5bd670b000001: {$exists: true}}) 

Но я хотел бы запросить это программно в Node.js + Mongoose.js как так,

var user_id = req.params.id; 
Item.find({ ratings.user_id : {$exists: true}}, function(err, items) { ... }); 

Где я становлюсь тупым. Mongoose.js берет точку нотации для внутренних объектов, но это интерпретирует user_id как литерал, а Mongoose.js не принимает квадратную скобку для внутренних объектов.

Вот пример схемы;

var ItemSchema = new mongoose.Schema({ 
    name: { type: String, required: true }, 
    ratings: { type: mongoose.Schema.Types.Mixed} 
}); 

И пример таких данных:

[ { 
     name: "Toaster", 
     ratings: { 
      "52126672b9f5bd670b000001": 1, 
      "52155b39a411791c29000001": -1 
     } 
    }, 
    { 
     name: "Griddle", 
     ratings: { 
      "52126672b9f5bd670b000001": 1, 
      "52126672b9f5bd670b000001": 1" 
     } 
    } 
} 

ответ

8
var user_id = req.params.id; 
var query = {}; 
query['ratings.' + user_id] = {$exists: true}; 
Item.find(query, function(err, items) { ... }); 

Ключ в объект, который вы посылаете Item.find должен быть строкой. Чтобы построить строку любых произвольных значений, вы должны сначала создать объект, а затем использовать обозначение скобки для его определения (то есть: query[anything+here] = data).

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