我很难写蒙哥的问询。我永远无法理解为什么它不返回我所期望的东西,是的,我正在阅读文档,但显然是愚蠢的理解。
在Compass中,我为一个带有城市文档数组的国家集合编写了这个查询。
{“Cities.CityName”:“丹佛”}
这将返回科罗拉多州文档以及文档数组中的所有城市。下面的示例只显示了一个城市文档,但它们都在那里。
{
"_id": {"$oid":"6146ada531696ee91a3f9fa4"},
"StateName": "Colorado",
"StateCode": "CO",
"Cities": [{
"_id": {"$oid":"6146ada531696ee91a3f5a50"},
"CityName": "Denver",
"Latitude": "39.55666000",
"Longitude": "-104.89609000"
}...]
}好的,我清楚地想,我们在CityName上匹配,现在只是投影城市文档的_id。
{"Cities._id":1}
但这总是返回给我的州文档id,而不是匹配的城市文档_id。
我做错了什么?
发布于 2021-09-23 06:23:09
1)您可以使用$(预测)或$elemMatch (投影)
<array>的内容以返回与数组上的查询条件匹配的第一个元素。{ "Cities.$": 1 }或{"Cities": { "$elemMatch": { "CityName": "Denver" } } }{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[{
"_id":{"$oid":"6146ada531696ee91a3f5a50"},
"CityName":"Denver",
"Latitude":"39.55666000",
"Longitude":"-104.89609000"
}]
}注意:,您必须在投影中指定所需的结果字段!
2)您可以在$filter方法中使用MongoDB 4.4支持的find()聚合操作符:
{
"Cities": {
"$filter": {
"input": "$Cities",
"cond": { "$eq": ["$$this.CityName", "Denver"] }
}
}
}{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[{
"_id":{"$oid":"6146ada531696ee91a3f5a50"},
"CityName":"Denver",
"Latitude":"39.55666000",
"Longitude":"-104.89609000"
}...{}]
}注意:,您必须在投影中指定所需的结果字段!
2.1)可以使用$map聚合运算符从Cities数组中只选择_ids:
{
"Cities": {
"$map": {
"input": {
"$filter": {
"input": "$Cities",
"cond": { "$eq": ["$$this.CityName", "Denver"] }
}
},
"in": "$$this._id"
}
}
}{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[
{"$oid":"6146ada531696ee91a3f5a50"},
{"$oid":"6146ada531696ee91a3f5a51"},
....
]
}注意:,您必须在投影中指定所需的结果字段!
3)您可以使用聚合方法合计()进行更多的定制:
- ex:
$match检查查询条件$addFields$filter和$map我在这里已经解释过了db.collection.aggregate([
{ "$match": { "Cities.CityName": "Denver" } },
{
"$addFields": {
"Cities": {
"$map": {
"input": {
"$filter": {
"input": "$Cities",
"cond": { "$eq": ["$$this.CityName", "Denver"] }
}
},
"in": "$$this._id"
}
}
}
}
])[
{
"Cities": [
ObjectId("6146ada531696ee91a3f5a50")
],
"StateCode": "CO",
"StateName": "Colorado",
"_id": ObjectId("6146ada531696ee91a3f9fa4")
}
]https://stackoverflow.com/questions/69294074
复制相似问题