Как предотвратить рекурсивное применение поиска в MongoDB к дереву ключ-значение? - PullRequest
0 голосов
/ 19 июля 2010

Представьте, что я храню этот объект (написанный с использованием литералов Ruby) в MongoDB:

{"tags" => ["foo", "bar"], 
 "jobs" => [{"title" => "Chief Donkey Wrangler", "tags" => ["donkeys"]}] }

Теперь я хочу искать объекты по тегам первого уровня данных, а не второго,Я могу написать такой запрос (используя библиотеку Ruby MongoDB):

things.find("tags" => {"$exists" => "foo"})

Это, очевидно, будет соответствовать первому примеру, но также будет соответствовать примеру, подобному этому:

{"tags" => ["baz", "bar"],
 "jobs" => [{"title" => "Trainee Donkey Wrangler", "tags" => ["donkeys", "foo"]}] }

Как мне убедиться, что я ищу только ключи верхнего уровня?Мне интересно знать ответ как на JavaScript, так и на Ruby и не зависящем от языка, поскольку я хотел бы использовать MongoDB в качестве межъязыкового хранилища.

Очевидно, я мог бы передать карту -уменьшить функцию до хранилища данных, чтобы выбрать то, что я пытаюсь получить, но мне интересно узнать, поддерживается ли оно на более высоком уровне (и чтобы сократить количество времени, которое я трачу на написание JavaScript-функций сокращения карты!)

Ответы [ 2 ]

2 голосов
/ 19 июля 2010

На самом деле указанный вами запрос не будет соответствовать вашему второму примеру. Чтобы соответствовать второму примеру, вы должны сделать:

things.find({"jobs.tags" => "foo"})

Нет рекурсивного применения селектора запросов.

1 голос
/ 19 июля 2010

Вы не используете $ существует правильно. $ Существующий не позволяет вам искать совпадение поля, он просто проверяет наличие такого поля. Я предполагаю, что библиотека Ruby MongoDB обрабатывает ваш запрос 'foo' как эквивалентный true, b / c $ существующие только принимает true / false в качестве аргумента

Как указывает @kb, вы хотите использовать точечную нотацию , чтобы добраться до объектов.

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