我在查询子计数器时有点迷失。
考虑以下事项:
{id: "I1", value: "V1"} and {id: "I2", value: "V2"}.
我想查询集合并获取包含名称为" gadget1"的小工具的所有内容。并且在components数组中包含一个名为" component1"的文档," component1" -subdocumnent也应该包含 在properties数组中的两个文件:
{ "$and": [{"gadgets.name": "gadget1"}{"gadgets.properties.id": "I1", "gadgets.properties.value": "V1"},{"gadgets.properties.id": "I2", "gadgets.properties.value": "V2"}]}
这可以通过查询吗?
我尝试过以下查询:
Select DATE_FORMAT(timecol,"%h:%i") AS time FROM chatLogTwo
但没有成功。
答案 0 :(得分:1)
所以这里有几件事。这实际上是$and
的情况,并且通常不需要它,但是当您在同一对象路径上需要多个条件时需要它。并且还要匹配数组子文档上的多个属性,您需要$elemMatch
:
db.collection.find({
"$and": [
{
"components.properties": {
"$elemMatch": {
"id": "I1", "value": "V1"
}
}
},
{
"components.properties": {
"$elemMatch": {
"id": "I2", "value": "V2"
}
}
}
]
})
这将告诉您文档在"components.properties"
中的“两个”数组元素实际上与两组条件匹配。
考虑到这一点,您实际上可以在此使用$all
,与$elemMatch
结合使用:
db.collection.find({
"components.properties": {
"$all": [
{ "$elemMatch": {
"id": "I1", "value": "V1"
}},
{ "$elemMatch": {
"id": "I2", "value": "V2"
}}
]
}
})