我很难写Mongo Query。我永远无法理解为什么它不返回我所期望的,是的,我正在读留档,但显然是哑巴理解。
在Compass中,我为带有城市文档数组的State集合编写此查询。
{“城市。城市名称”:“丹佛”}
这将返回给我科罗拉多州文档,其中包含文档数组中的所有城市。我下面的示例仅显示了一个城市文档,但它们都在那里。
{
"_id": {"$oid":"6146ada531696ee91a3f9fa4"},
"StateName": "Colorado",
"StateCode": "CO",
"Cities": [{
"_id": {"$oid":"6146ada531696ee91a3f5a50"},
"CityName": "Denver",
"Latitude": "39.55666000",
"Longitude": "-104.89609000"
}...]
}
好的,所以我想清楚了,我们现在匹配了城市名称,只是投射了城市文件的_id。
{“城市。_id”: 1}
但这总是返回给我的州文件id不是匹配的城市文件_id。
我做错了什么?
>
用例:位置$运算符限制的内容
例如:{"城市。$": 1}
或{"城市": { "$elemMatch":{"城市名称":"丹佛" } } }
结果:
{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[{
"_id":{"$oid":"6146ada531696ee91a3f5a50"},
"CityName":"Denver",
"Latitude":"39.55666000",
"Longitude":"-104.89609000"
}]
}
游乐场
注意:您必须在投影中指定所需的结果字段!
>
用例:根据指定的条件选择要返回的数组子集。返回一个数组,其中仅包含与条件匹配的那些元素。返回的元素按原始顺序排列。
前:
{
"Cities": {
"$filter": {
"input": "$Cities",
"cond": { "$eq": ["$$this.CityName", "Denver"] }
}
}
}
{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[{
"_id":{"$oid":"6146ada531696ee91a3f5a50"},
"CityName":"Denver",
"Latitude":"39.55666000",
"Longitude":"-104.89609000"
}...{}]
}
游乐场
注意:您必须在投影中指定所需的结果字段!
>
用例:将表达式应用于数组中的每个项目,并返回一个包含应用结果的数组。
前:
{
"Cities": {
"$map": {
"input": {
"$filter": {
"input": "$Cities",
"cond": { "$eq": ["$$this.CityName", "Denver"] }
}
},
"in": "$$this._id"
}
}
}
{
"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
"Cities":[
{"$oid":"6146ada531696ee91a3f5a50"},
{"$oid":"6146ada531696ee91a3f5a51"},
....
]
}
游乐场
注意:您必须在投影中指定所需的结果字段!
-例如:
$match
检查查询条件$addFields
添加或格式化现有属性$filter
和$map我在2)点中解释过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")
}
]