Я новичок в mongoDb и создал запрос, который удовлетворяет моим функциональным требованиям:
db.collection.find(
{
"typeD": "ABC"
, "typeT": {$size: 2}
, "typeT": { $all: ["def", "abc"] }
, "typeC": { $size: 3}
, "typeC": { $all: ["pdf", "video", "png"] }
, "properties": {$size: 3}
,"properties":
{
$all:
[
{"$elemMatch": {"name": "propName1", "value": "proName1_value"} }
, {"$elemMatch": {"name": "propName2", "value": "proName2_value"} }
, {"$elemMatch": {"name": "propName3", "value": "proName3_value"} }
]
}
);
Я хочу найти документы, которые точно содержат элементы, предоставленные массивами - как фиксированный порядокэлементы внутри массивов не могут быть приняты, я выбрал оператор $ all и для обеспечения точного соответствия добавил дополнительное ограничение с размером $.
Вышеупомянутый запрос может быть выполнен на оболочке mongo без проблем.
При попытке выполнить этот оператор с помощью Java с помощью mongoTemplate у меня возникают некоторые проблемы:
BasicQuery query = new BasicQuery(queryString);
CollectionEntity existingCmc = this.mongoTemplate.find(query, CollectionEntity.class);
После первой строки Java query.toString () предоставляет:
db.collection.find(
{
"typeD": "ABC"
, "typeT": { $all: ["def", "abc"] }
, "typeC": { $all: ["pdf", "video", "png"] }
,"properties":
{
$all:
[
{"$elemMatch": {"name": "propName1", "value": "proName1_value"} }
, {"$elemMatch": {"name": "propName2", "value": "proName2_value"} }
, {"$elemMatch": {"name": "propName3", "value": "proName3_value"} }
]
}
);
Как мне выполнить запрос, который отвечает всем моим требованиям?Могу ли я переписать запрос так, чтобы в запросе было указано одно условие для каждого атрибута?Как я могу сказать mongoTemplate, чтобы он не «переписывал» предыдущее условие для этого атрибута?
Заранее спасибо