diff --git a/db_test.go b/db_test.go index 8f22fa7..a3b6c95 100644 --- a/db_test.go +++ b/db_test.go @@ -1190,6 +1190,51 @@ func TestExportAndImportCollection(t *testing.T) { require.Equal(t, todo1, todo2) } + + exportFilePath = exportPath + "dualExportByquery.json" + err = db.CreateCollection("dualExport") + require.NoError(t, err) + defer db.DropCollection("dualExport") + + doc1 := d.NewDocument() + doc1.Set("title", "dualExport") + doc1.Set("completed", false) + doc1.Set("status", 1) + doc2 := d.NewDocument() + doc2.Set("title", "dualExport") + doc2.Set("completed", true) + doc2.Set("status", 0) + err = db.Insert("dualExport", doc1, doc2) + require.NoError(t, err) + + err = db.ExportCollectionByQuery( + q.NewQuery("dualExport").Where(q.Field("status").Eq(0)), + exportFilePath, + ) + require.NoError(t, err) + + err = db.ImportCollection("dualExportByquery", exportFilePath) + require.NoError(t, err) + defer db.DropCollection("dualExportByquery") + + docs, err = db.FindAll(q.NewQuery("dualExport").Where(q.Field("status").Eq(0)).Sort()) + require.NoError(t, err) + + importDocs, err = db.FindAll(q.NewQuery("dualExportByquery").Sort()) + require.NoError(t, err) + + require.Equal(t, len(docs), len(importDocs)) + + type dual struct { + Title string `json:"title" clover:"title"` + Completed bool `json:"completed,omitempty" clover:"completed"` + Status uint `json:"status" clover:"status"` + } + dual1 := &dual{} + dual2 := &dual{} + require.NoError(t, docs[0].Unmarshal(dual1)) + require.NoError(t, importDocs[0].Unmarshal(dual2)) + require.Equal(t, dual1, dual2) }) } diff --git a/examples/update/main.go b/examples/update/main.go index 9fd4b38..c28356a 100644 --- a/examples/update/main.go +++ b/examples/update/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" c "github.com/ostafen/clover/v2" d "github.com/ostafen/clover/v2/document" @@ -49,4 +50,36 @@ func main() { for _, todo := range todos { fmt.Printf("title: %v, userId: %v\n", todo.Get("title"), todo.Get("userId")) } + + exists, err := db.HasCollection("dualCollection") + if err != nil { + log.Fatal(err) + } + if exists { + err = db.DropCollection("dualCollection") + if err != nil { + log.Fatal(err) + } + } + + err = db.CreateCollectionByQuery( + "dualCollection", + query.NewQuery("todos").Where(query.Field("completed").Eq(true)).Limit(1), + ) + if err != nil { + log.Fatal(err) + } else { + collections, err := db.ListCollections() + if err != nil { + log.Fatal(err) + } + for k, v := range collections { + fmt.Printf("collection_%d: %s\n", k, v) + } + } + + dualTodos, _ := db.FindAll(query.NewQuery("dualCollection")) + for _, v := range dualTodos { + fmt.Printf("title: %v, completed: %v\n", v.Get("title"), v.Get("completed")) + } } diff --git a/json.go b/json.go index b368d48..31f333f 100644 --- a/json.go +++ b/json.go @@ -38,6 +38,24 @@ func (db *DB) ExportCollection(collectionName string, exportPath string) error { return ioutil.WriteFile(exportPath, jsonString, os.ModePerm) } +// ExportCollectionByQuery exports a dual collection by query to a JSON file. +func (db *DB) ExportCollectionByQuery(q *query.Query, exportPath string) error { + dualCollection := "dual_" + NewObjectId() + + err := db.CreateCollectionByQuery(dualCollection, q) + if err != nil { + return err + } + defer db.DropCollection(dualCollection) + + err = db.ExportCollection(dualCollection, exportPath) + if err != nil { + return err + } + + return nil +} + // ImportCollection imports a collection from a JSON file. func (db *DB) ImportCollection(collectionName string, importPath string) error { file, err := os.Open(importPath)