使用Mongo查询查找数组元素

时间:2016-12-05 20:14:08

标签: mongodb mongodb-query

在我的数据库中有这样的结构记录:

{ 
  "_id" : "YA14163134", 
  "discount" : "", 
  "retail" : "115.0000", 
  "cost" : "", 
  "description" : "Caterpillar Mens Big Twist Analog Watch", 
  "stock_update" : "05", 
  "brand" : "Kronos", 
  "img_url" : "image2342000.jpg", 
  "UPC" : "4895053708012", 
  "stock" : [ [ "1611292138", "5" ], [ "1612032232", "4" ], [ "1612050918", "0" ] ] 
}

并寻找查询以获取所有包含" stock" " 1612050918"值。那是更新ID。

尝试类似:

db.vlc.find({stock: {$elemMatch:{$all:["1612050918"]}}})

db.vlc.find({stock: { $in : ['1611292138']}})

db.vlc.find({stock: { $all : [[1611292138]]}})

没有结果。只有当我在请求中包含第二个数组元素时才能工作

db.vlc.find({stock: { $all : [['1611292138', '7']]}})

但是当我需要任何数量时,这限制了我对使用qnty 7更新的所有项目的请求。提前谢谢!

2 个答案:

答案 0 :(得分:1)

使用此查询:

{
    "stock" : {
        "$elemMatch" : {
            "$elemMatch" : {
                "$eq" : "1611292138"
            }
        }
    }
}

说明:

  • 第一个$ elemMatch允许您扫描 stock
  • 下的所有三个阵列
  • nex $ elemMatch允许您扫描子数组中的两个元素
  • 由于$ elemMatch需要查询对象,因此$ eq表示法用于文字匹配。

如果你知道" 1611292138"将永远是子数组的第一个元素,您的查询变得更简单:

{ "stock" : { "$elemMatch" : { "0" : "1611292138" } } }

说明:

  • 扫描库存
  • 下的所有阵列
  • 寻找" 1611292138"在每个子阵列的第一个插槽中

答案 1 :(得分:0)

使用嵌套$elemMatch,如下所示:

db.vlc.find({stock: { "$elemMatch":{"$elemMatch":{"$all":["1612050918"]}}}})

或者

 db.vlc.find({stock: {"$elemMatch":{ "$elemMatch":{"$in" : ["1612050918"]}}}})