1

Expressjs と mongoosejs を使用して記述された Web API があります。

アプリのメイン スキーマには、permissions配列フィールドを含むサブドキュメント が含まれています。これらの配列には、そのドキュメントに対してアクションを実行できるユーザーの ID が含まれています。

readサブドキュメント配列フィールドの値によって、そのコレクションに対するクエリの結果を制限しようとしています:

主なスキーマは次のとおりです。

var MainSchema = new Schema({
    uri: { type: String, required: false },
    user: { type: String, required: false },
    groups: [String],           
    tags: [String],
    permissions: {
        read: [String],
        update: [String],
        delete: [String]
    }
});

permissions.read配列に特定の値を持つドキュメント、またはその配列が空のドキュメントを返したいです。

私のコードはエラーをスローしませんが、結果を制限しません。指定された値と一致せず、空ではないドキュメントがまだ取得されます。

これが私が持っているものです:

var MainModel = mongoose.model('MainSchema', MainSchema);

app.get('/api/search', function (req, res) {
    var query = MainModel.find({'uri': req.query.uri }); 

    // This works fine
    if (req.query.groups) {
        query.where('groups').in(req.query.groups);
    }
    else if (req.query.user) {
        query.where('user').equals(req.query.user);
    }

    // How can I return only documents that match req.query.user or ""?
    query.where('permissions.read').in([req.query.user, ""]);

    query.exec(function (err, results) {
      if (!err) {
        return res.send(results);
      } else {
        return console.log(err);
      }
    });
});

句が、句に渡された配列の各値に対して各where要素の値をテストしていないという予感があります。permissions.readin

ありがとう。

編集:これは返されるべきではないドキュメントですが、(permissions.read配列には現在のユーザーのIDではない値が含まれていることに注意してください):

{
    "user": "firstname@gmail.com",
    "uri": "http://localhost:3000/documents/test",
    "permissions": {
      "delete": [
        "firstname@gmail.com"
      ],
      "update": [
        "firstname@gmail.com"
      ],
      "read": [
        "firstname@gmail.com"
      ]
    },
    "tags": [],
    "groups": [
      "demo",
      "2013"
    ]
}

EDITED : モデル/スキーマの混乱を修正しました。これは私のコードにはありませんでしたが、コピー/貼り付けでは除外されていました。ありがとう。

4

1 に答える 1

3

サブドキュメント配列フィールドまたは空の配列フィールドで指定された値をテストする mongodb/mongoose クエリの例を探しましたが、見つかりませんでした。

代わりに、API (このコードの元) とクライアント アプリケーションの両方を制御するため、リファクタリングを行いました。

whereクライアント側のユーザー選択に基づいて、次の 3 つの句のいずれかをクエリに追加します。

if (req.query.mode === 'user') {
    query.where('user').equals(req.query.user);
}
else if (req.query.mode === 'group') {
    query.where('groups').in(req.query.groups);
    query.$where('this.permissions.read.length === 0');
}
else if (req.query.mode === 'class') {
    query.$where('this.permissions.read.length === 0');
}

@JohnnyHK さん、ご意見ありがとうございます。

于 2013-02-26T21:19:24.230 に答える