如何比较数组mongodb查询

时间:2019-06-15 18:26:28

标签: node.js mongodb mongoose

我目前正在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

2 个答案:

答案 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}
})