【问题标题】:MongoDB query - Nested ObjectMongoDB 查询 - 嵌套对象
【发布时间】:2021-01-24 10:35:59
【问题描述】:

我正在尝试检索嵌套对象中属性值之一以“-”开头的所有文档。下面是示例文档 - 我想搜索“counts”数组对象并查找嵌套对象中的任何“value”属性是否以“-”开头

{
  "_id": "XYZ",
  "departureDate": "2020-10-09",
  "travelerCounts": [
    {
      "counts": [
        {
          "key": "J",
          "value": "4"
        },
        {
          "key": "Y",
          "value": "4"
        }
      ],
      "travelCountType": "ActualCapacity"
    },
    ...
  ]
 },
 {
   "_id": "XYZ1",
  "departureDate": "2020-10-09",
  "travelerCounts": [
    {
      "counts": [
        {
          "key": "J",
          "value": "18"
        },
        {
          "key": "Y",
          "value": "-1"
        }
      ],
      "travelCountType": "ActualCapacity"
    }
    ...
  ]
 }

我试过了,但没有运气 -

db.myCollection.find(
{departureDate: "2020-10-09"},
{
    "travelerCounts": { 
        "$elemMatch": {
            "travelCountType": "ActualCapacity",
            "counts": {
                "$elemMatch": {
                    "value": { $regex : /^-/ }
                }
            }
        }
    }
})

请帮忙

【问题讨论】:

  • 您最好将值存储为 number 并与$lt: 0 进行比较
  • 是的,我同意,但这是在生产中,我们无法更改数据类型

标签: mongodb mongodb-query mongo-shell


【解决方案1】:

如官方MongoDB documentation中所说:

如果您在 $elemMatch 表达式中仅指定一个条件,并且没有在 $elemMatch 中使用 $not 或 $ne 运算符,则可以省略 $elemMatch。请参阅单一查询条件。

这适用于检索至少其中一个嵌套文档包含以破折号开头的值的所有文档:

collection.find({"departureDate": "2020-10-09", "travelerCounts.counts.value": {"$regex" : /^-/}})

在您的示例中,您使用的是过滤器的投影参数(find 方法中的第二个参数),这是不正确的。

编辑:检索所有集合文档的解决方案,这些文档在嵌套的 travelerCounts 中至少有一个文档,满足以下条件:

  • travelCountType 是“ActualCapacity”。
  • counts 包含至少一个值以破折号开头的文档。

查询:

collection.find({"departureDate": "2020-10-09", "travelerCounts": {"$elemMatch": {"travelCountType": "ActualCapacity", "counts.value": {"$regex" : /^-/}}}})

【讨论】:

  • 谢谢,但这不起作用。我必须匹配“travelCountType”:“ActualCapacity”。 travelerCounts 是一个数组,它有一个数组“count”对象和“travelCountType”属性
  • 可以添加多个“and”条件:collection.find({"departureDate": "2020-10-09", "travelerCounts.travelCountType": "ActualCapacity", "travelerCounts.counts.value ": {"$regex" : /^-/}})
  • 谢谢,还是不行。 TravelerCounts 是一个数组,它可以包含多个对象。我是新手,我认为我们需要识别 travelCountType 为“ActualCapacity”的元素,然后在该元素中将成为“count”数组,我们需要搜索以“-”开头的“value”属性.我们需要使用位置运算符吗
  • 我想我终于明白这个问题了,试试这个:collection.find({"departureDate": "2020-10-09", "travelerCounts": {"$elemMatch": {"travelCountType" :“ActualCapacity”,“counts.value”:{“$regex”:/^-/}}}})。我将编辑答案以包含此解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 1970-01-01
  • 2012-07-23
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多