我目前正在mongodb电子商务应用程序上构建购物车系统。我需要有关如何查询和比较数组的帮助。
此处的购物车文件:
{
"_id" : ObjectId("5d0531e27c8fa1029017ea20"),
"user" : ObjectId("5d0371319315c715fc34b0b0"),
"active" : true,
"item" : [
{
"product" : ObjectId("5d013eb63a2bdd11a46c8dd3"),
"option" : [
{
"name" : "Ukuran",
"value" : "Biru"
}
],
"quantity" : 1
},
{
"product" : ObjectId("5d013eb63a2bdd11a46c8dd3"),
"option" : [
{
"name" : "Ukuran",
"value" : "Biru"
}
],
"quantity" : 1
}
],
"created_at" : ISODate("2019-06-15T17:58:58.762Z"),
"updated_at" : ISODate("2019-06-15T17:59:13.334Z"),
"__v" : 0
}
我想比较item.option字段的对象,所以我的购物车系统是如果数据库上的购物车具有相同的对象选项,我将添加数量,否则将新对象推送到item。
目前,我没有问如何实现购物车系统,但我想比较每个item.option对象
我已经尝试过了
const cart = await CartModel.find({
"item.option": option
})
并获得错误Error: Query filter must be an object, got an array
答案 0 :(得分:1)
由我自己解决,经过多次实验最终我结合了$ in和$ elemMatch来比较每个对象数组
// this is will dynamic
const optionArray = [
{
"name": "Warna",
"value": "Biru"
},
{
"name": "Ukuran",
"value": "XL"
}
]
const compareOptionQuery = []
for (let i = 0; i < optionArray.length; i++) {
compareOptionQuery.push({
$elemMatch: {
...option[i]
}
})
}
const cart = await CartModel.aggregate([
{
$and: [
{
_id: cartId,
user: userId
},
{
'item.option': {
$in: [...compareOptionQuery]
}
}
]
}
])
答案 1 :(得分:0)
实现的问题在于,在CartModel.find("item.option": option)
中,过滤器(第一个参数)遇到的是数组而不是对象。
这是因为您试图从option
中调用对象item
,但是option
是 array字段 < / strong> item
。
如果您希望从数组字段访问item
,则必须使用item
在数组字段{<array field>: {<operator1>: <value1>}}
中的元素上指定条件,如下所示:
CartModel.find({
item: {$option: option}
})