首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文档阵列的Mongo项目_id

文档阵列的Mongo项目_id
EN

Stack Overflow用户
提问于 2021-09-23 04:34:07
回答 1查看 255关注 0票数 0

我很难写蒙哥的问询。我永远无法理解为什么它不返回我所期望的东西,是的,我正在阅读文档,但显然是愚蠢的理解。

在Compass中,我为一个带有城市文档数组的国家集合编写了这个查询。

{“Cities.CityName”:“丹佛”}

这将返回科罗拉多州文档以及文档数组中的所有城市。下面的示例只显示了一个城市文档,但它们都在那里。

代码语言:javascript
复制
{
"_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。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-23 06:23:09

1)您可以使用$(预测)$elemMatch (投影)

  • 用例:位置$操作符限制<array>的内容以返回与数组上的查询条件匹配的第一个元素。
  • ex: { "Cities.$": 1 }或​{"Cities": { "$elemMatch": { "CityName": "Denver" } } }
  • 结果:
代码语言:javascript
复制
{
 ​"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
 ​"Cities":[{
   ​"_id":{"$oid":"6146ada531696ee91a3f5a50"},
   ​"CityName":"Denver",
   ​"Latitude":"39.55666000",
   ​"Longitude":"-104.89609000"
 ​}]
}

游乐场

注意:,您必须在投影中指定所需的结果字段!

2)您可以在$filter方法中使用MongoDB 4.4支持的find()聚合操作符:

  • 用例:选择数组的子集,以便根据指定的条件返回。返回一个数组,其中只包含与条件匹配的元素。返回的元素按原来的顺序排列。
  • ex:
代码语言:javascript
复制
{ 
  "Cities": { 
    "$filter": { 
      "input": "$Cities", 
      "cond": { "$eq": ["$$this.CityName", "Denver"] } 
    } 
  } 
}
  • 结果:
代码语言:javascript
复制
{
 ​"_id":{"$oid":"6146ada531696ee91a3f9fa4"},
 ​"Cities":[{
   ​"_id":{"$oid":"6146ada531696ee91a3f5a50"},
   ​"CityName":"Denver",
   ​"Latitude":"39.55666000",
   ​"Longitude":"-104.89609000"
 ​}...{}]
}

游乐场

注意:,您必须在投影中指定所需的结果字段!

2.1)可以使用$map聚合运算符从Cities数组中只选择_ids:

  • 用例:将表达式应用于数组中的每个项,并返回带有应用结果的数组。
  • ex:
代码语言:javascript
复制
{ 
  "Cities": { 
    "$map": {
      "input": {
        "$filter": { 
          "input": "$Cities", 
          "cond": { "$eq": ["$$this.CityName", "Denver"] } 
        }
      },
      "in": "$$this._id"
    }
  } 
}
  • 结果:
代码语言:javascript
复制
{
  "_id":{"$oid":"6146ada531696ee91a3f9fa4"},
  "Cities":[
    {"$oid":"6146ada531696ee91a3f5a50"},
    {"$oid":"6146ada531696ee91a3f5a51"},
    ....
  ]
}

游乐场

注意:,您必须在投影中指定所需的结果字段!

3)您可以使用聚合方法合计()进行更多的定制:

- ex:

  • $match检查查询条件
  • 添加或格式化现有属性的$addFields
  • $filter和$map我在这里已经解释过了
代码语言:javascript
复制
db.collection.aggregate([
  { "$match": { "Cities.CityName": "Denver" } },
  {
    "$addFields": {
      "Cities": {
        "$map": {
          "input": {
            "$filter": {
              "input": "$Cities",
              "cond": { "$eq": ["$$this.CityName", "Denver"] }
            }
          },
          "in": "$$this._id"
        }
      }
    }
  }
])

游乐场

  • 结果:
代码语言:javascript
复制
[
  {
    "Cities": [
      ObjectId("6146ada531696ee91a3f5a50")
    ],
    "StateCode": "CO",
    "StateName": "Colorado",
    "_id": ObjectId("6146ada531696ee91a3f9fa4")
  }
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69294074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档