2012-06-05 2 views
2

Я хотел бы запросить все объекты, у которых есть поле, содержащее определенное значение. Например, у меня есть два документа:запрос mongodb без имени поля

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

и хотел бы получить все объекты, которые имеют поле, значение которого «яблоко», но я не знаю имя поля. Можно ли указать запрос в MongoDB для достижения этого? (Числовые ключи в объектах - это идентификаторы детей, а значения в объектах - длинные GUID)

ответ

5

К сожалению, MongoDB не поддерживает какой-либо метод запроса ко всем полям с определенным значением. Существует существующий билет Jira с просьбой об этом усовершенствовании: https://jira.mongodb.org/browse/SERVER-1248. Не стесняйтесь комментировать, голосовать или следовать за этим билетом.

В то же время обычным способом обработки этого является изменение схемы MongoDB. Для примера, вы бы изменить существующую схему:

{"123": "apple", "217": "pear", "179": "orange"} 
{"831": "pear", "189": "grapes"} 

И вы можете структурировать это что-то вроде этого:

{ tags: [ 
     { cid: "123", value: "apple" }, 
     { cid: "217", value: "pear" }, 
     { cid: "179", value: "orange" }, 
     ] 
    } 
    { tags: [ 
     { cid: "831", value: "pear" }, 
     { cid: "189", value: "grapes" }, 
     ] 
    } 

После того, как вы сделали это, вы можете выполнить follwing запрос, чтобы найти все искомых документов:

db.docs.find({'tags.value': "apple" }) 

Обратите внимание, что эта схема позволяет индексировать «tags.cid» и поля «tags.value», который исходная схема не делает.

Надеюсь, это поможет.

-William

0

Вы можете использовать полнотекстовый индекс на всех полях.

use dbname 
db.collectionname.ensureIndex(
          { "$**": "text" }, 
          { name: "TextIndex" } 
         ) 

Тогда Поиск Использование:

DB db = mongoClient.getDB("dbname"); 
DBCollection coll = db.getCollection("collectionname"); 
BasicDBObject query = new BasicDBObject(); 
      query.append("$text", new BasicDBObject("$search", searchstring)); 
      DBCursor cursor = coll.find(query); 
Смежные вопросы