我正在尝试从购物车集合的项目数组中查找(并更新)特定对象。 购物车文档看起来像这样
{
_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
},
请告诉我我做错了什么。
位置运算符仅在更新操作中有用。如果你想获取数组中的子文档,你可能需要使用如下的聚合管道。
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
}