【问题标题】:MongoDb return only one element from the arrayMongoDb 只返回数组中的一个元素
【发布时间】:2025-12-20 00:00:11
【问题描述】:

所以我的收藏看起来像这样:

{
  "_id" : ObjectId("52722429d874590c15000029"),
  "name" : "Bags",
  "products" : [{
      "_id" : ObjectId("527225b5d87459b802000029"),
      "name" : "Prada",
      "description" : "Prada Bag",
      "points" : "234",
      "validDate" : 1382562000,
      "link" : "dasdad",
      "code" : "423423424",
      "image" : null
    }, {
      "_id" : ObjectId("5272307ad87459401a00002a"),
      "name" : "Gucci",
      "description" : "Gucii bag",
      "points" : "2342",
      "validDate" : 1383170400,
      "link" : "dsadada",
      "code" : "2342",
      "image" : null
    }]
}

我只想获得 _id 为 527225b5d87459b802000029 的产品,我尝试了这个:

$this->find(array(
                '_id' => new \MongoId('52722429d874590c15000029'),
                'products._id' => new \MongoId('527225b5d87459b802000029')
                ));

但它会返回该集合的整个数组,而我只想要一个...这可以在 mongo 中完成吗?

【问题讨论】:

  • 难道没有findOne() 而不是find() 吗?
  • @johnny 已经看过了..但对我不起作用
  • 您需要在findfindOne 调用中添加投影参数。
  • 我找到了使用聚合聚合的解决方案(array(array('$match' => array('_id' => '52722429d874590c15000029')), array('$unwind' => '$products '), array('$match' => array('products._id' => '5272307ad87459401a00002a')), ));

标签: php mongodb nosql


【解决方案1】:

如 cmets 中所述,您必须添加一个投影,更准确地说是一个 $elemMatch。这种情况下不需要使用聚合框架。

例子:

find( { _id: 1, "products._id": 4 }, { products: { $elemMatch: { _id: 4 } } } ).pretty()

【讨论】: