2015-03-26 2 views
2

Короче говоря, я создаю модель пользователя, которая должна иметь возможность истекать подписок, и задавалась вопросом, как правильно их хранить с помощью Sails. Вид модели мне нужно:Как хранить вложенный массив объектов в модели Sails.js?

User : { 

    ... 

    subscriptions : [{ 
     artist : <association>, 
     starts : { 
      type : "date" 
     }, 
     expires : { 
      type : "date" 
     } 
    }] 

    ... 

Я использую MongoDB, и знаю, что это возможно, однако это должно быть сделано через Sails.js' Ватерлинии ОРМ. Должен ли я использовать отдельную «Подписную» модель, которая связана с пользователями и художниками?

+0

Короткий ответ: да! вам нужна новая отдельная модель для подписки –

ответ

2

Все зависит от того, как вы хотите делать запросы к своим подпискам позже.

Метод поиска SailsJS не позволяет прямо указать User.find({"subscriptions.expires">=today}), если подписки определены как Массив или Коллекция.

Если вы определяете подписку как модель, вы можете сделать ее коллекцией в своей модели пользователя, ссылаясь на подписку, а затем выполнять запросы с подпиской, например Subscrition.find({'expires'>=somedate).

Недостатком является то, что это создает новую коллекцию, которая имеет взаимосвязь между двумя моделями, вы не получаете встроенный объект со всеми вашими данными, если это то, что вы пытаетесь выполнить.

Если вы хотите, чтобы все это было в внедренном объекте, вы можете это сделать, но тогда вам необходимо использовать метод Waterline .native, который позволяет отправлять прямые запросы в форме драйвера MongoDB NodeJS, как указано в Node.js MongoDB Driver API Documentation

было бы что-то вроде

User.native(function(err, collection) { 
if (err) { 
    return console.log(err); 
} else { 
    collection 
    .find({ 
     'subscriptions.expires': { 
     $gte: new Date(2012, 7, 14) 
     } 
    }, { 
     'data': 1 
    }, 0, 1) 
    .toArray(function(err, subscriptions) { 
     if (err) { 
     return console.log(err); 
     } else { 
     if (subscriptions.length > 0) { 
      // Do whatever here 
     } else { 
      return console.log('No subscriptions found'); 
     } 

     } 
    }); 
} 
}); 
Смежные вопросы