【问题标题】:How to Query Mongoose Nested Data? (mongoose/express)如何查询 Mongoose 嵌套数据? (猫鼬/快递)
【发布时间】:2021-04-11 16:08:22
【问题描述】:

我希望从我的 mongoose 数据集合中查询项目数据。我只需要用户“456”项目“4”的“库存”布尔值,但是当我在我的示例中查询时,我会收到整个用户对象。

数据:

data = [{
    userId: "123",
    items: [{
        item: "2",
        stocked: false
      },
      {
        item: "3",
        stocked: true
      },
      {
        ...more items
      }
    ],
  },

  {
    userId: "456",
    items: [{
        item: "1",
        stocked: true
      },
      {
        item: "4",
        stocked: true
      },
      {
        ...more items
      }
    ],
  },

  {
    ...more users
  }
]

路线:

router.post("/example", (req, res) => {

  Data.findOne({
      userId: "456",
      "items.item": "4"
    }
  }).then((item) => {
  console.log(item) // desired: {item: "4", stocked: true}

  if (item.stocked) {
    console.log("Item is stocked!")
  }
})

})

问题:响应是整个用户对象,包括所有项目:

{
  userId: "456",
  items: [{
      item: "1",
      stocked: true
    },
    {
      item: "4",
      stocked: true
    },
    {
      ...more items
    }
  ],
},

期望的响应:{ item: "4", stocked: true }

任何提示或帮助将不胜感激!

【问题讨论】:

  • 我知道我可以使用点表示法来访问其中的存储值,但我希望通过 mongoose 查询完全做到这一点。谢谢。

标签: javascript reactjs mongodb express mongoose


【解决方案1】:

使用聚合管道,您可以使用 $elemMatch 或 $unwind。

$elemMatch 运算符将查询结果中的字段内容限制为仅包含与 $elemMatch 条件匹配的第一个元素。

Data.aggregate([
 {$match: {userId: "456", "items.item": "4"}},
 {$project: { items: { $elemMatch: { "items.item": "4"} }}}
]);

$unwind 将返回所有符合您条件的元素。

Data.aggregate([
 {$match: {userId: "456", "items.item": "4"}},
 {$unwind: "$items"},
 {$match: { "items.item": "4"} }
])

【讨论】:

  • 嘿,非常感谢@Haniel Baez!第一个选项不起作用,因此我对其进行了研究,发现您可能无法在聚合函数中使用 $elemMatch:stackoverflow.com/a/36651117/14849955 。除此之外,第二个确实可以满足我的需要。有趣的是,当它返回时,它仍然在对象中保留了 userId: "456"。这是我的回复:{ userId: "456", item: "4", stocked: true },效果很好,但我仍然希望只得到回复 { item: "4", stocked: true }。跨度>
  • 有趣的是,Data.aggregate([ {$match: {userId: "456", "items.item": "4"}}]) 和第二种方法一样有效跨度>
  • 您可以添加一个 $projection 状态,以从结果中消除 userId;像这样 --> { $project: { userId: 0, item: 1, stocked: 1 } }
猜你喜欢
  • 2021-03-23
  • 2019-04-06
  • 2020-05-23
  • 1970-01-01
  • 2019-04-05
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多