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フィールドの値が指定された値以上(つまり、値)であるドキュメントを選択し>=ます (例: value.)。

続きを読む

$gt

構文:{field: {$gt: value} }

$gtフィールドの値が指定された値より大きい(つまり >)ドキュメントを選択します。

続きを読む

于 2013-07-29T08:16:56.737 に答える