0

これらは、Mongo DB employees Collection に存在する 3 つのサンプル レコードです。

ご覧のとおり、以下に示すレコードの 1 つで、「国」という名前のフィールドが1 つ欠落しています。

db.employees.find().pretty()

{
        "_id" : ObjectId("513331a227a414395af00904"),
        "name" : "Ravi",
        "age" : "21",
        "dept" : "DEV",
        "country" : "IND"
}


{
        "_id" : ObjectId("513331e627a414395af00905"),
        "name" : "Pavan",
        "age" : "23",
        "dept" : "DEV"
}

{
        "_id" : ObjectId("513331e627a414395af00907"),
        "name" : "Saagy",
        "age" : "22",
        "dept" : "DEV",
        "country" : "US"
}

上記のレコードに示すように、コレクション内の古いレコードに一部のキーが存在しない可能性がある既存の Mongo DB に取り組んでいます。

現在、以下のコードでは、国のキーが別の Record に存在しないため、応答として 1 つのレコードしか取得していません。

    DBCollection mycollection = db.getCollection("employees");
    BasicDBObject query = new BasicDBObject();
    query.put("dept", "DEV");
    query.put("country", "IND");

    DBCursor cursor = mycollection.find(query);

    while (cursor.hasNext()) 
    {
    System.out.println(cursor.next());
    }

私の要件は、国キーが存在しない場合、それを IND として扱い、応答にも含める必要があるということです。

これは可能ですか??

私にお知らせください 。

更新部分

$exists を使用してみましたが、例外が発生しています

public class Test {

    public static void main(String args[]) throws UnknownHostException {
        Mongo mongo = new Mongo();
        DB db = mongo.getDB("test");
        DBCollection mycollection = db.getCollection("employees");

        BasicDBObject query = new BasicDBObject();
        query.put("dept", "DEV");
        query.put("country", "IND");
        DBObject subquery = new BasicDBObject("country", new BasicDBObject("$exists", false));

        DBCursor cursor = mycollection.find(query,subquery);

        while (cursor.hasNext()) 
        {
        System.out.println(cursor.next());
        }




    }



Exception in thread "main" com.mongodb.MongoException: Unsupported projection option: $exists
    at com.mongodb.MongoException.parse(MongoException.java:82)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:314)
    at com.mongodb.DBApiLayer$MyCollection.__find(DBApiLayer.java:295)
    at com.mongodb.DBCursor._check(DBCursor.java:368)
    at com.mongodb.DBCursor._hasNext(DBCursor.java:459)
    at com.mongodb.DBCursor.hasNext(DBCursor.java:484)
    at com.Test.main(Test.java:26)
4

1 に答える 1

1

この問題は、$or と $exists の組み合わせで解決できます。これはほぼ正しいはずです:

public class Test {

public static void main(String args[]) throws UnknownHostException {
    Mongo mongo = new Mongo();
    DB db = mongo.getDB("test");
    DBCollection mycollection = db.getCollection("employees");

    DBObject clause1 = new BasicDBObject("country", "IND");  
    DBObject clause2 = new BasicDBObject("$exists", false);    
    BasicDBList or = new BasicDBList();
    or.add(clause1);
    or.add(clause2);

    BasicDBObject query = new BasicDBObject();
    query.put("dept", "DEV");
    query.put("$or", or);

    DBCursor cursor = mycollection.find(query);

    while (cursor.hasNext()) 
    {
    System.out.println(cursor.next());
    }




}
于 2013-03-03T14:54:59.497 に答える