如何在Sails.js模型中存储嵌套对象数组?

时间:2015-03-26 18:38:44

标签: sails.js waterline sails-mongo

长话短说我正在创建一个需要能够过期订阅的用户模型,并且想知道如何使用Sails正确存储它们。我需要的模型是:

User : {

    ...

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

    ...

我正在使用MongoDB,并且知道这是可能的,但是需要通过Sails.js的Waterline ORM来完成。我是否必须使用与用户和艺术家相关联的单独“订阅”模型?

1 个答案:

答案 0 :(得分:2)

这完全取决于您以后如何对订阅进行查询。

如果订阅被定义为数组或集合,则SailsJS find方法不会直接处理User.find({"subscriptions.expires">=today})的方式。

如果您将Subscription定义为模型,那么您可以将其设置为User模型中的集合,引用Subscription,然后对Subscription执行查询,如Subscrition.find({'expires'>=somedate)

缺点是,这会创建一个具有两个模型之间关系的新集合,如果您尝试完成此任务,则不会获得包含所有数据的嵌入对象。

如果你希望它全部在嵌入式对象中,你可以这样做,但是你需要使用Waterline .native方法,它允许你以MongoDB NodeJS驱动程序的形式发送直接查询,如{{ 3}}

这就像是

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');
        }

      }
    });
}
});