使用$ where查询子数组类型文档的多个条件

时间:2013-07-29 08:09:25

标签: mongodb mongo-java

我有一个看起来像这样的文件:

{
  "_id" : ObjectId("50a8240b927d5d8b5891743c"),
  "cust_id" : "abc",
  "ord_date" : ISODate("2012-10-03T18:30:00Z"),
  "status" : "A",
  "price" : 25,
  "items" : [
    {
      "sku" : "mmm",
      "qty" : 5,
      "price" : 2.5
    },
    {
      "sku" : "nnn",
      "qty" : 5,
      "price" : 2.5
    }]
}

现在我想使用$where查询"qty">5"sku"=='mmm'

的所有项目
I tried the following
{
   "$where" : "this.items.some(function(entry){return entry.qty>5})&&this.items.some(function(entry){return entry.sku=='ggg'})
}

但它不起作用。我想只使用“$ where”

来做

1 个答案:

答案 0 :(得分:1)

使用$where您可以使用if创建一个for循环,您可以在其中设置条件。如果条件满足,它将返回true

db.col_t.find(
   { 
      $where: "for (var i = 0; i < this.items.length; ++i) { if (this.items[i].sku === 'mmm' && this.items[i].qty > 5) return true; }"
   }).pretty();

或者更短的直接输入$where的值,如下:

db.col_t.find("for (var i = 0; i < this.items.length; ++i) { if (this.items[i].sku === 'mmm' && this.items[i].qty > 5) return true; }").pretty();

我建议您以这种方式使用$elemMatch$gt

查询:

{
   items: {
     $elemMatch: {
        qty: { $gt: 5 },
        sku: "mmm"
     }
   }
}

警告:此查询不会检索您的文档,因为使用$gt它会搜索比>更大的数字(5)。如果您需要$gte,请使用>=


参考文献:

$elemMatch

  

$ elemMatch运算符匹配数组元素中的多个组件

     

read more

$gte

  

语法{field: {$gte: value} }

     

$gte选择字段值大于或等于的文档(即>=)指定值(例如值。)

     

read more

$gt

  

语法{field: {$gt: value} }

     

$gt选择字段值大于(即&gt;)指定值的文档。

     

read more