根据列表中的值查询模型

时间:2014-01-14 14:00:08

标签: node.js sails.js waterline

当我通过电子邮件查询用户时:

User.findOne({email: 'a@a.com'}).done(function(err, u){console.log(u.sessionTokens);})

我得到了令牌列表:

[ { token: '8dfe6aa0-2637-4b3f-9a3c-3ae8dc225b77',
    issuedAt: Tue Jan 14 2014 14:40:22 GMT+0100 (CET) } ]

但是当我在此列表中查询令牌时,它不会检索用户:

User.findOne({'sessionTokens.token':'8dfe6aa0-2637-4b3f-9a3c3ae8dc225b77'}).done(function(err, u){console.log(u);})

=> undefined

有什么想法吗? User.findOne({'sessionTokens.token':'8d...77'})是否是正确的查询?

修改

我的用户模型类似于:

module.exports = {

  schema: true,

  attributes: {

    email: {
      type: 'email',
      required: true
    },

    encryptedPassword: {
      type: 'string'
    },

    sessionTokens: {
      type: 'array'
    },
    ...
  }
}

sessionToken是Array类型的属性。这个数组包含几个对象:

{ token: '8dfe6aa0-2637-4b3f-9a3c-3ae8dc225b77',
issuedAt: Tue Jan 14 2014 14:40:22 GMT+0100 (CET) }

修改

我已经用mongo-sails而不是mongo-disk进行了测试,这个工作正常,但是当Chad指出这一点时,它取决于所使用的适配器。

1 个答案:

答案 0 :(得分:2)

在robdubya&的帮助下sfb_在#sailsjs @freenode中,我们讨论了一个解决方案。答案取决于您使用的适配器。我最熟悉的适配器是mysql适配器,在该适配器中,'array'属性类型作为JSON字符串被序列化到数据库。因此,在这种情况下,在模型查询中使用'contains'修饰符可以让您找到您要查找的记录:

var criteria = {
  sessionToken: {
    contains: '8dfe6aa0-2637-4b3f-9a3c-3ae8dc225b77'
  }
};

User.findOne(criteria).done(function (err, user) {
  ...
});