2013-04-09 7 views
2

Я хочу, чтобы получить все документы, где поле загрузки не существуетMongoDB Java Driver - Использование существует проекция в находят запрос

find{ "download" : {$exists: false}} 

Для Java я нашел пример:

BasicDBObject neQuery = new BasicDBObject(); 
    neQuery.put("number", new BasicDBObject("$ne", 4)); 
    DBCursor cursor = collection.find(neQuery); 

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

Моя адаптация

 BasicDBObject field = new BasicDBObject(); 
     field.put("entities.media", 1); 
    field.put("download", new BasicDBObject("$exists",false)); 
    System.out.println("Start Find"); 
    DBCursor cursor = collection.find(query,field);  
     System.out.println("End Find Start Loop ALL 100k"); 
    int i = 1; 
       while(cursor.hasNext()) 

Exists линия не работает:

Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:616) 
     at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58) 
Caused by: 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 ImgToDisk.main(ImgToDisk.java:61) 
     ... 5 more 

У него нет никакой подсказки прямо сейчас, что было бы правильной адаптацией, так как я получил свой запрос, работающий в оболочке, и с UMongo, передача в java кажется не так-то просто увидеть.

+0

вы обращаетесь к объекту запроса в вашей находке() вызов. может быть полезно включить, что в примере – rompetroll

ответ

7

использовать

collection.find(query,field); 

DBObject, что является второй параметр метода находят используется, чтобы указать, какие атрибуты из итоговых документов, которые вы хотите быть возвращены. Это полезно для снижения сетевой нагрузки.

В вашем примере вы пытаетесь поместить предложение $ exist в DBObject field. Это не сработает. Второй объект параметра может иметь только значения атрибута 1 (включая этот атрибут) или 0 (исключить).

Поместите его в первый DBObject, который называется query.

Также см here и here

+0

вы совершенно правы, я был ослеплен, 9 – Dukeatcoding

2

вы можете использовать DBCollection, чтобы сделать это с JAVA API

public List<BasicDBObject> Query(String collection, Map<String, String> query, String... excludes) { 
BasicDBObject bquery = new BasicDBObject(query); 
BasicDBObject bexcludes = new BasicDBObject(excludes.length); 
for (String ex : excludes) { 
    bexcludes.append(ex, false); 
} 
return db.getCollection(collection, BasicDBObject.class).find(bquery).projection(bexcludes) 
    .into(new ArrayList<BasicDBObject>()); 

}

дб MongoDataBase

 Смежные вопросы

  • Нет связанных вопросов^_^