@@ -36,21 +36,22 @@ class Database extends Base {
3636 async set ( key , value ) {
3737 if ( ! Util . isKey ( key ) ) throw new Error ( "Invalid key specified!" , "KeyError" ) ;
3838 if ( ! Util . isValue ( value ) ) throw new Error ( "Invalid value specified!" , "ValueError" ) ;
39+ const parsed = Util . parseKey ( key ) ;
3940 let raw = await this . schema . findOne ( {
40- ID : key
41+ ID : parsed . key
4142 } ) ;
4243 if ( ! raw ) {
4344 let data = new this . schema ( {
44- ID : key ,
45- data : value
45+ ID : parsed . key ,
46+ data : parsed . target ? Util . setData ( key , { } , value ) : value
4647 } ) ;
4748 await data . save ( )
4849 . catch ( e => {
4950 return this . emit ( "error" , e ) ;
5051 } ) ;
5152 return data . data ;
5253 } else {
53- raw . data = value ;
54+ raw . data = parsed . target ? Util . setData ( key , Object . assign ( { } , raw . data ) , value ) : value ;
5455 await raw . save ( )
5556 . catch ( e => {
5657 return this . emit ( "error" , e ) ;
@@ -66,11 +67,21 @@ class Database extends Base {
6667 */
6768 async delete ( key ) {
6869 if ( ! Util . isKey ( key ) ) throw new Error ( "Invalid key specified!" , "KeyError" ) ;
69- let data = await this . schema . findOneAndDelete ( { ID : key } )
70- . catch ( e => {
71- return this . emit ( "error" , e ) ;
72- } ) ;
73- return data ;
70+ const parsed = Util . parseKey ( key ) ;
71+ const raw = await this . schema . findOne ( { ID : parsed . key } ) ;
72+ if ( ! raw ) return false ;
73+ if ( parsed . target ) {
74+ let data = Util . unsetData ( key , Object . assign ( { } , raw . data ) ) ;
75+ raw . data = data ;
76+ raw . save ( ) . catch ( e => this . emit ( "error" , e ) ) ;
77+ return data ;
78+ } else {
79+ let data = await this . schema . findOneAndDelete ( { ID : parsed . key } )
80+ . catch ( e => {
81+ return this . emit ( "error" , e ) ;
82+ } ) ;
83+ return data ;
84+ }
7485 }
7586
7687 /**
@@ -100,12 +111,17 @@ class Database extends Base {
100111 */
101112 async get ( key ) {
102113 if ( ! Util . isKey ( key ) ) throw new Error ( "Invalid key specified!" , "KeyError" ) ;
103- let get = await this . schema . findOne ( { ID : key } )
114+ const parsed = Util . parseKey ( key ) ;
115+
116+ let get = await this . schema . findOne ( { ID : parsed . key } )
104117 . catch ( e => {
105118 return this . emit ( "error" , e ) ;
106119 } ) ;
107120 if ( ! get ) return null ;
108- return get . data ;
121+ let item ;
122+ if ( parsed . target ) item = Util . getData ( key , Object . assign ( { } , get . data ) ) ;
123+ else item = get . data ;
124+ return item ? item : null ;
109125 }
110126
111127 /**
@@ -285,19 +301,32 @@ class Database extends Base {
285301 * [{ ID: "foo", data: "bar" }, { ID: "hi", data: "hello" }]
286302 * ```
287303 * @param {Array } data Array of data
288- * @param {boolean } ordered If set to false, it will insert valid documents before throwing errors (if any)
304+ * @param {object } ops Import options
305+ * @param {boolean } [ops.validate=false] If set to true, it will insert valid documents only
306+ * @param {boolean } [ops.overwriteExisting=false] If it should overwrite existing value (slow)
289307 * @example const data = QuickDB.all(); // imports data from quick.db to quickmongo
290308 * QuickMongo.import(data);
291309 * @returns {Promise<Boolean> }
292310 */
293- import ( data = [ ] , ordered = true ) {
294- return new Promise ( ( resolve , reject ) => {
311+ import ( data = [ ] , ops = { overwriteExisting : false , validate : false } ) {
312+ return new Promise ( async ( resolve , reject ) => {
295313 if ( ! Array . isArray ( data ) ) return reject ( new Error ( `Data type must be Array, received ${ typeof data } !` , "DataTypeError" ) ) ;
296314 if ( data . length < 1 ) return resolve ( false ) ;
297- this . schema . insertMany ( data , { ordered : ! ! ordered } , ( error ) => {
298- if ( error ) return reject ( new Error ( `${ error } ` , "DataImportError" ) ) ;
315+ if ( ! ops . overwriteExisting ) {
316+ this . schema . insertMany ( data , { ordered : ! ops . validate } , ( error ) => {
317+ if ( error ) return reject ( new Error ( `${ error } ` , "DataImportError" ) ) ;
318+ return resolve ( true ) ;
319+ } ) ;
320+ } else {
321+ data . forEach ( ( x , i ) => {
322+ if ( ! ops . validate && ( ! x . ID || ! x . data ) ) return ;
323+ else if ( ! ! ops . validate && ( ! x . ID || ! x . data ) ) return reject ( new Error ( `Data is missing ${ ! x . ID ? "ID" : "data" } path!` , "DataImportError" ) ) ;
324+ setTimeout ( ( ) => {
325+ this . set ( x . ID , x . data ) ;
326+ } , 457 * ( i + 1 ) ) ;
327+ } ) ;
299328 return resolve ( true ) ;
300- } ) ;
329+ }
301330 } ) ;
302331 }
303332
@@ -481,20 +510,27 @@ class Database extends Base {
481510
482511 /**
483512 * Returns random entry from the database
484- * @param {number } total total entries to return
513+ * @param {number } n Number entries to return
485514 * @returns {Promise<any[]> }
486515 * @example const random = await db.random();
487516 * console.log(random);
488517 */
489- async random ( total = 1 ) {
490- if ( typeof total !== "number" || total < 1 ) total = 1 ;
518+ async random ( n = 1 ) {
519+ if ( typeof n !== "number" || n < 1 ) n = 1 ;
491520 const data = await this . all ( ) ;
492- const arr = [ ] ;
493- for ( let i = 0 ; i < total ; i ++ ) {
494- const entry = data [ Math . floor ( Math . random ( ) * data . length ) ] ;
495- if ( ! arr . includes ( entry ) ) arr . push ( entry ) ;
496- }
497- return arr ;
521+ if ( n > data . length ) throw new RangeError ( "Random value length may not exceed total length." ) ;
522+ const shuffled = data . sort ( ( ) => 0.5 - Math . random ( ) ) ;
523+ return shuffled . slice ( 0 , n ) ;
524+ }
525+
526+ /**
527+ * This method acts like `quick.db#table`. It will return new instance of itself.
528+ * @param {string } name Schema/Model name
529+ */
530+ table ( name ) {
531+ if ( ! name || typeof name !== "string" ) throw new Error ( "Invalid model name" ) ;
532+ const CustomModel = new Database ( this . dbURL , name , this . options ) ;
533+ return CustomModel ;
498534 }
499535
500536 /**
@@ -526,7 +562,7 @@ class Database extends Base {
526562 * @example console.log(db.toString());
527563 */
528564 toString ( ) {
529- return `< ${ this . constructor . name } QuickMongo> ` ;
565+ return `${ this . schema . modelName } ` ;
530566 }
531567
532568 /**
0 commit comments