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-disk の代わりに mongo-sails でテストしましたが、これは正常に動作していますが、Chad が指摘したように、使用するアダプターによって異なります。

4

1 に答える 1

2

#sailsjs@freenode の robdubya と sfb_ の助けを借りて、この解決策について少し議論しました。答えは、使用しているアダプターによって異なります。私が最もよく知っているアダプターは mysql アダプターで、そのアダプターでは、「配列」属性タイプが JSON 文字列としてデータベースにシリアライズされます。その場合、モデルのクエリで 'contains' 修飾子を使用すると、探しているレコードを見つけることができます。

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

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