2

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

{
  "_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”来做到这一点

4

1 回答 1

1

使用$where您可以创建一个 for 循环,if其中您将设置条件。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 运算符匹配数组元素中的多个组件

阅读更多

$gte

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

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

阅读更多

$gt

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

$gt选择字段值大于(即>)指定值的那些文档。

阅读更多

于 2013-07-29T08:16:56.737 回答