1

当我从其电子邮件中查询用户时:

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 指出的那样,这取决于所使用的适配器。

4

1 回答 1

2

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

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

User.findOne(criteria).done(function (err, user) {
  ...
});
于 2014-01-15T14:59:13.047 回答