我是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运算符,并确保精确匹配以增加其他限制与$ size。
以上查询可以在mongo shell上执行,没有任何问题。
当尝试使用mongoTemplate使用Java执行此语句时,出现一些问题:
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,不要“覆盖”此属性的先前条件?
预先感谢
答案 0 :(得分:0)
MongoDB查询实际上是Map(键-值对)。 由于您两次定义了“属性”键,因此它被覆盖了。 您可以使用“ $ and”运算符来完成所需的查询。
{ "$and": [
{ "properties": { "$size": 3 } },
{ "properties": { $all:
[
{"$elemMatch": {"name": "propName1", "value": "proName1_value"} },
{"$elemMatch": {"name": "propName2", "value": "proName2_value"} },
{"$elemMatch": {"name": "propName3", "value": "proName3_value"} }
]
} }
] }