【问题标题】:How to use $elemMatch query in mongodb如何在 mongodb 中使用 $elemMatch 查询
【发布时间】:2019-11-14 13:57:54
【问题描述】:

我尝试使用 $elemmatch 过滤数据,但无法正常工作。
我的场景

产品表

[
  {
    id:1.
    product:[
     {
       id:1,
       name:true
     },
     {
       id:2,
       name:true
     },
     {
      id:3,
      name:false
     }
   ]
  }
]  

查询

db.Prod.find(
    {"product.name": true}, 
    {_id: 0, product: {$elemMatch: {name: true}}});

我得到了输出

[
 {
   id:1.
   product:[
     {
       id:1,
       name:true
     }
  ]
 }
]

异常输出

[
 {
   id:1.
   product:[
    {
      id:1,
      name:true
    },
    {
     id:2,
     name:true
    }
   ]
  }
]  

如何实现这个场景,我参考了这个链接Retrieve only the queried element in an object array in MongoDB collection,我尝试了这个链接中提到的所有答案。但它仍然不起作用可以给出一个示例查询。

【问题讨论】:

  • 请用缩进格式化您的代码,现在很难阅读
  • @Kannan 我编辑的代码格式可以请检查一下

标签: mongodb mongoose mongodb-query


【解决方案1】:

嗯,您可能没有尝试引用链接中提供的聚合,因为它非常有效。

db.collection.aggregate([
  {
    $match: {
      "product.name": true
    }
  },
  {
    $project: {
      product: {
        $filter: {
          input: "$product",
          as: "prod",
          cond: {
            $eq: [
              "$$prod.name",
              true
            ]
          }
        }
      }
    }
  }
])

将输出:

[
  {
    "_id": 1,
    "product": [
      {
        "id": 1,
        "name": true
      },
      {
        "id": 2,
        "name": true
      }
    ]
  }
]

Here's the example.

编辑: From the doc :

使用注意事项

$ 运算符和 $elemMatch 运算符都投影 first 根据条件匹配数组中的元素。

考虑到这一点,您无法通过查找查询来实现您所需要的,而只能通过聚合查询来实现。

【讨论】:

  • 不,我只想使用 find 函数,而不是聚合函数。我的场景使用;你找到功能
  • 使用聚合有什么问题?
  • 其实我使用的是打字稿代码所以,在很多情况下我使用 find 方法来检索数据。但在这种情况下,我无法更改聚合函数。我会维护标准化代码
  • 所以你不能用 mongo 查询来做到这一点,你必须在 TS 中过滤你的结果。请参阅我编辑的答案。
猜你喜欢
  • 2016-02-20
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-12
  • 1970-01-01
相关资源
最近更新 更多