0

コレクション配列でユーザー名とパスワードを一致させようとしています。私のサンプルドキュメントは

{
    "_id" : ObjectId("51f20148a85e39af87510305"),
    "group_name" : "sai",
    "users" : [
            {
                "full_name" : "sumit",
                "user_name" : "sumitdesh",
                "password" : "mggg",
                "status" : "Active"
            },
            {
                "full_name" : "ad",
                "user_name" : "asd",
                "password" : "asdf",
                "status" : "Active"
            },
}

上記の配列でユーザーが入力したユーザー名とパスワードを一致させようとしています。ユーザー名とパスワードがデータと一致すると、ユーザーはログインします。私のJavaコードは

BasicDBObject u = new BasicDBObject("users.user_name", uname);
 BasicDBObject p = new BasicDBObject("users.password", password);
 f=con.coll.find(u,p); 
4

2 に答える 2

0

ドキュメント構造がここで邪魔になるかもしれません。ログインしているユーザーをどのように区別しますか? 一致すると、すべてのユーザーを含むドキュメント全体が返されます。

とにかく、複数の比較でクエリするには:

BasicDBObject query = new BasicDBObject();
List<BasicDBObject> parts = new ArrayList<BasicDBObject>();
parts.add(new BasicDBObject("users.user_name", uname));
parts.add(new BasicDBObject("users.password", password));
query.put("$and", parts);

DBCursor cursor = collection.find(query);
while (cursor.hasNext()) {
    System.out.println(cursor.next());
}
于 2013-07-27T04:58:40.953 に答える
0

$elemMatchクエリ演算子を使用する必要があります。

このようなものが動作するはずです:

BasicDBObject elementQuery = new BasicDBObject("user_name", uname);
element.put("password", password);

BasicDBObject query = new BasicDBObject("users", 
                         new BasicDBObject("$elemMatch", elementQuery);

f=con.coll.find(query); 

ロブ。

PS 余談ですが、すべてのユーザーを 1 つのドキュメントに含めることは、おそらく最適ではありません。ユーザー名とパスワードを記載した、ユーザーごとに個別のドキュメントを作成することを検討しましたか?

パフォーマンスが向上する可能性があるスキーマの例は、グループとユーザーを 2 つのコレクションに分割することです。各ユーザーには、次のようなドキュメントがあります。

{
    "_id" : "sumitdesh",
    "full_name" : "sumit",
    "password" : "mggg",
    "status" : "Active"
    "groups" : [ "sai", "admin" ],
}

グループのすべてのメンバーを頻繁にクエリする場合は、おそらく「グループ」にインデックスを付けたいと思うでしょう。

グループ ドキュメントは次のようになります。

{
    "_id" : "sai",
    "permissions" : [ "read", "write_secrets" ]
}

インデックスのアクセス許可。

sumitdesh ユーザーの読み取り許可のチェックは次のとおりです。

db.groups.findOne( 
    {
         _id : { "$in" : [ "sai", "admin" ] } , 
         "permissions" : "read" 
    } 
);

「$in」の配列は、「sumitdesh」ユーザー ドキュメントのグループの配列と同じであることに注意してください。

PPS ...そして、パスワードと言うときは、ソルトされたパスワードのハッシュ (SHA-2?) を意味しますか? 右?

于 2013-07-27T04:59:14.757 に答える