【问题标题】:How to query an object inside an array by multiple value in mongoose (javascript)?如何通过猫鼬(javascript)中的多个值查询数组内的对象?
【发布时间】:2021-07-20 18:57:43
【问题描述】:

我有一个对象,服务器将收到一个user_id 和一个part_id。我需要获取特定用户,然后通过提供的部件 ID 过滤部件并获取价格。

{ _id: 6086b8eec1f5325278846983, user_id: '13', car_name: '车名 1', created_at: 2008-11-25T00:46:52.000Z, 部分: [ { _id: 6086ee212681320190c3c8e0, part_id: 'P456', part_name: '零件名称 1', image: '图片网址', 统计:{ 价格:10, } }, { _id: 6087e7795e2ca925fc6ead27, part_id: 'P905', part_name: '零件名称 2', image: '图片网址', 统计:{ 价格:15, } } ] }

我尝试运行以下命令,但忽略了 part_id 过滤器并返回数组中的每个部分。

Custumers.findOne({'user_id': '13', 'parts.part_id': 'P456'})

也尝试了聚合,但仍然没有运气。

Customers.aggregate([
    { $match: { 'user_id': '13'}}
]).unwind('parts')

我查看了 mongoose 文档,但无法理解它。请让我知道我缺少什么。

猫鼬版本:5.12.4

【问题讨论】:

    标签: javascript mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    选项 - 1

    如果您只有 1 个匹配的部分,这将起作用

    $ (projection)

    $ 运算符根据查询语句中的某些条件将每个文档中的第一个匹配数组元素投影到集合中。

    演示 - https://mongoplayground.net/p/tgFL01fK3Te

    db.collection.find(
     { "user_id": "13", "parts.part_id": "P456" },
     { "parts.$": 1, car_name: 1 } // add fields you need to projection
    )
    

    选项-2

    $unwind

    演示 - https://mongoplayground.net/p/_PeP0WHVpJH

    db.collection.aggregate([
      {
        $match: {
          "user_id": "13",
          "parts.part_id": "P456"
        }
      },
      {
        $unwind: "$parts" //  break into individual documents
      },
      {
        $match: {
          "parts.part_id": "P456"
        }
      }
    ])
    

    【讨论】:

    • 谢谢,过滤效果很好,只返回所需的部分,但是当我尝试访问 stats 时,它给出了 undefined
    • 检查添加到投影 - mongoplayground.net/p/Zx5qNT8FW3F
    • 谢谢 Tushar,这就是我要找的那个。
    • @TKX 很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 2014-03-10
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2017-04-29
    • 2017-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多