位置运算符 ($) 无法正常工作

问题描述 投票:0回答:1

我正在尝试从购物车集合的项目数组中查找(并更新)特定对象。 购物车文档看起来像这样

{
    _id: ObjectId("661fb9ddc2b236ae8703ba92"),
    display_id: '38bd6126-02a1-47b9-b567-00aaf2eb076f',
    user_id: ObjectId("661137f22a31832ceb92ddbc"),
    items: [
      {
        product_id: ObjectId("6622376051d5886f39ac7365"),
        size: ObjectId("660d444d0d7716ee24129675"),
        qty: 3
      },
      {
        product_id: ObjectId("662214f8cc5306f999369e99"),
        size: ObjectId("660d444d0d7716ee24129675"),
        qty: 2
      },
      {
        product_id: ObjectId("662214f8cc5306f999369e99"),
        size: ObjectId("660d444d0d7716ee24129674"),
        qty: 2
      }
    ],
    __v: 4
  }

我尝试运行的查询是

db.carts.find({user_id: new ObjectId("661137f22a31832ceb92ddbc"), "items.product_id": new ObjectId("662214f8cc5306f999369e99"), "items.size":new ObjectId("660d444d0d7716ee24129675")}, {"items.$":1})

或猫鼬

const doc = await Cart.findOne({
                user_id: user_id,
                "items.product_id": product_id,
                "items.size": oldSize
            },{"items.$":1})

理想情况下它应该返回这个对象:

{
 product_id: ObjectId("662214f8cc5306f999369e99"),
 size: ObjectId("660d444d0d7716ee24129675"),
 qty: 2
}

但它返回这个:

{
 product_id: ObjectId("6622376051d5886f39ac7365"),
 size: ObjectId("660d444d0d7716ee24129675"),
 qty: 3
},

请告诉我我做错了什么。

database mongodb mongoose positional-operator
1个回答
0
投票

位置运算符仅在更新操作中有用。如果你想获取数组中的子文档,你可能需要使用如下的聚合管道。

db.collection.aggregate([
  {
    "$match": {
      "user_id": ObjectId("661137f22a31832ceb92ddbc"),
      "items.product_id": ObjectId("662214f8cc5306f999369e99"),
      "items.size": ObjectId("660d444d0d7716ee24129675")
    }
  },
  {
    "$unwind": "$items"
  },
  {
    "$match": {
      "items.product_id": ObjectId("662214f8cc5306f999369e99"),
      "items.size": ObjectId("660d444d0d7716ee24129675")
    }
  },
  {
    "$replaceRoot": {
      "newRoot": "$items"
    }
  }
])

蒙戈游乐场


这样做可能看起来很乏味。事实上,如果您发现自己最常在

items
级别工作,建议您将
items
条目“扁平化”到单独的文档中,如下所示。您可能会获得一些好处,例如更简单的查询和索引带来的性能提升。

{
    display_id: "38bd6126-02a1-47b9-b567-00aaf2eb076f",
    user_id: ObjectId("661137f22a31832ceb92ddbc"),
    product_id: ObjectId("662214f8cc5306f999369e99"),
    size: ObjectId("660d444d0d7716ee24129675"),
    qty: 2
}

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.