inQueryのサブ検索条件の不具合
sensp opened this issue · 0 comments
sensp commented
不具合の概要(Description of bug)
- 不具合を再現させる手順・サンプルコード(Step for Reproduce bug / Sample code)
1)事前環境設定:ユーザーの新規登録(250件)
2)事前環境設定:follow Classに user,followUserポインタを設定(250件)
(特定のuserは複数followUserポインタを設定する(例:5件))
3)特定のuserをuserクラスから削除する
4)follow Classに user,followUserポインタを検索する
正:follow Class(250) - followUserポインタ(削除特定のuser(例:5件) = 245件
不:95件しか取得出来ません。
-サンプルコード
<title>JavaScript SDK クイックスタート(ブラウザ版)</title> // TODO: ご自身のある場所ncmb.min.jsを設定してください。 <script type="text/javascript" src="ncmb_js-2.1.2/ncmb.min.js" charset="utf-8"></script> <script language="javascript"> // TODO: 以下の2つはご自身のものを設定してください。 var application_key = "xxxxx"; var client_key = "xxxxx"; var ncmb = new NCMB(application_key, client_key); //1)ユーザー登録場合 ======================================== function userCreate(){ //250件作成 for (var i = 1; i < 251; i++) { //Userのインスタンスを作成 var user = new ncmb.User(); //アクセスを許可するACLオブジェクトを作成 var acl = new ncmb.Acl(); acl.setPublicReadAccess(true); acl.setPublicWriteAccess(true); //ユーザー名・パスワードを設定 user.set("userName", "user" + String(i)) .set("password", "12345") .set("acl",acl); // 新規登録 user.signUpByAccount() .then(function(){ // 登録後処理 }) .catch(function(err){ // エラー処理 }); } console.log("ユーザー登録完了しました。"); } //2)ユーザーオブジェクトにポインタ(全部)登録場合 ======================================== function userPointUpdate(){ ncmb.User.limit(300) .fetchAll() .then(function(results){ //ユーザー検索には全員のパーミション設定要る console.log("user size= " + results.length); for (var i = 0; i < results.length; i++) { //User var userObject1 = results[i]; //次のUser var userObject2 = results[i+1]; //Food新オブジェクト var followObject = ncmb.DataStore("follow"); var follow = new followObject(); //ユーザーオブジェクトをfollowポインタを設定 follow.set("no", String(i) ); follow.set("user",userObject1 ); if(i == 90 || i == 91 || i == 190 || i == 191 ){ //同じfollowUser(user)固定 follow.set("followUser",results[1] ); console.log("results[1]固定=" + i + " / " + results[1].get("objectId")); }else{ follow.set("followUser",userObject2 ); } follow.save(); } }) .catch(function(err){ console.log(err); }); console.log("follow Class 全登録しました。"); } //★follow クラス検索★ ======================================== function userSelect(){ //1.基準になる会員管理の情報参考 ncmb.User.exists('objectId', true).limit(300).count().fetchAll() .then(function(results){ console.log("会員管理の全件数情報 = " + results.length); //2.follow クラス検索実施 //2-1)条件設定 var user = ncmb.DataStore("user"); var existUser = user.exists('objectId' , true).limit(300); //★対応1 //2-2)検索実施 var followObjects = ncmb.DataStore('follow'); followObjects.inQuery( 'followUser', existUser) //★対応3(今回の不具合発生) .limit(300) //★対応2 .order("createDate",false) //作成日を降順(true),昇順(false) .fetchAll() .then(function(results){ console.log("実施follow 検索ユーザー件数 = " + results.length); //ユーザー検索 for (var i = 0; i < results.length; i++) { //console.log("objectId= " + results[i].get("objectId")); //console.log("no= " + results[i].get("no")); } }) .catch(function(err){ console.log(err); }); }) } </script>
-テスト確認項目
・ user.exists('objectId' , true).limit(300);
・ user.in('objectId' , [objectId1,objectId2...]).limit(300);
-参照
・コミュニティ NIFCLOUD-mbaas/UserCommunity#629
・対応:
1.exists()クエリのオペランド -> .limit(300); //Max値設定要ります。
2.fetchAllする側 -> .limit(300); //Max値設定要ります。
3.inQueryがlinmit指定設定が出来てないようです。→Javascript SDKの改善が必要です。
【ncmb_js-*.*.*\lib\query.js】修正場所 (L402) this._where[key]["$inQuery"]= {where: subquery._where, className: className}; =>修正(limit:subquery._limit追加する) this._where[key]["$inQuery"]= {where: subquery._where, limit:subquery._limit, , className: className};
以上です。