NIFCLOUD-mbaas/ncmb_js

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};

以上です。