过滤重复值。

时间:2014-09-29 01:41:19

标签: java google-cloud-datastore google-cloud-platform

我正在尝试添加过滤器以检查用户可能输入的重复值。我不确定我的查询在哪里出错。

我的查询不会进入循环以检查名称是否已存在。

我对google-could还不错。如果有人可以告诉我如何解决我的问题或者是否有更好的解决方案。

    else if ( commandEls[0].equals( "add_director" ) ) {
        String name = commandEls[1];
        String gender = commandEls[2];
        String date_of_birth = commandEls[3];


        boolean duplicate = false;
        //add a director record with the given fields to the datastore, don't forget to check for duplicates

        Entity addDirectorEntity = new Entity("Director");

        // check if the entity already exits 
        // if !duplicate add, else "Already exisits"

        Query directorExists = new Query("Movies");

        // Director Name is the primary key
        directorExists.addFilter("directorName",Query.FilterOperator.EQUAL, name);
        System.out.print(name);
        PreparedQuery preparedDirectorQuery = datastore.prepare(directorExists);

        System.out.print("outside");    
        for(Entity directorResult : preparedDirectorQuery.asIterable()){
            // result already exists in the database
            String dName = (String) directorResult.getProperty(name);
            System.out.print(dName);
            System.out.print("finish");
            duplicate = true;
        }

        if(!duplicate){ 
            addDirectorEntity.setProperty("directorName",name);
            addDirectorEntity.setProperty("directorGender",gender);
            addDirectorEntity.setProperty("directorDOB",date_of_birth);

            try{
                datastore.put(addDirectorEntity);
                results = "Command executed successfully!";
            }
            catch(Exception e){
                results = "Error";
            }
        }

        else {
            results = "Director already exists!";
        }

    }

2 个答案:

答案 0 :(得分:0)

非祖先查询(如示例中的查询)最终是一致的,因此无法可靠地检测重复的属性值。祖先查询完全一致,但它们需要使用实体组来构建数据,这需要以写入吞吐量为代价。

如果您示例中的directorName属性确实是唯一的,则可以DirectorDirector个实体。然后,当您插入新的{{1}}实体时,您可以先检查它是否已存在(在事务内)。

数据存储区中没有通用的内置方式来确保属性值的唯一性。这个相关的use it as the name in the key包含了对近似唯一性约束的一些可能策略的讨论。

我还建议您阅读数据存储区中的feature requestqueries

答案 1 :(得分:0)

这是有效的事情,但我想出了我的问题。 我正在制作导演实体,因为那应该是电影。