mon go находят ли синтаксис для "точного соответствия внедренного документа" двусмысленным с "неявным и"? - PullRequest
1 голос
/ 09 апреля 2020

Мне кажется, что в синтаксисе запроса mon go есть некоторая неопределенность, или я что-то упускаю. Я думаю, что второй вариант более вероятен, если да, дайте мне знать, где я ошибаюсь.

из пн go документы:

Укажите условие равенства. Чтобы задать условия равенства, используйте <field>:<value> выражения в документе фильтра запросов: { <field1>: <value1>, ... } В следующем примере из инвентарной коллекции выбираются все> документы, статус которых равен «D»:

db.inventory.find( { status: "D" } )

, поэтому {status: "D", title: "sometitle"} находит документы одновременно с status = "D" и title = "sometitle", поскольку между записями в этом объекте есть неявный оператор "и".

с другой стороны, снова из документов:

Например, следующий запрос выбирает все документы, размер поля которых равен документу { h: 14, w: 21, uom: "cm" }:

db.inventory.find( { size: { h: 14, w: 21, uom: "cm" } } )

, поэтому выполняется оператор равенства для значения размера (вложенный документ) и заданного документа.

и синтаксис выглядит довольно похожим на меня, за исключением того, что один запрашивает вложенный документ, а другой - документ верхнего уровня. , что выберет этот запрос:

{address: {street: "abc", city: "somecity"}}

равно ли оно: address == {street: "abc", city: "somecity"} или "address.street" =="abc" and "adress.city=="somecity" (but there might exists other fields like "zipcode"

каково эмпирическое правило при определении, когда один выполняет синтаксический анализ запроса, если словарь (карта / объект) является точным значением или набор операторов равенства объединен с "и"?

1 Ответ

0 голосов
/ 09 апреля 2020

Для плоских объектов это довольно ясно:

db.col.find({status: "D", title: "sometitle"})

работает как неявное И, поэтому в сопоставленном документе может быть больше полей, и он будет возвращен запросом. Так что это будет работать и для:

{status: "D", title: "sometitle", otherField: false}

Момент, когда начинается неоднозначность и путаница, - это когда у вас есть вложенные объекты, такие как:

{ subObject: {status: "D", title: "sometitle", otherField: false} }

Рекомендуемый синтаксис, который все еще действует как неявный и это точечная запись:

db.col.find({"subObject.status": "D", "subObject.title": "sometitle"})

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

Последняя часть - это совпадение равенства для подобъектов, которое менее популярно, и всех свойств. в этом случае должны совпадать, поэтому:

db.col.find({ subObject: {status: "D", title: "sometitle", otherField: false} })

вернет документ, но:

db.col.find({ subObject: {status: "D", title: "sometitle"} })

не вернет ничего, так как в документе есть больше полей. Столь длинная история, используйте обозначение точка .

...