提问者:小点点

Mongo项目文件阵列_id


我很难写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个答案

匿名用户

>

  • 用例:位置$运算符限制的内容

    例如:{"城市。$": 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")
      }
    ]