1

各アイテムが次のように見えるレシピのコレクションがある場合:

{
    name: "Recipe 1",
    ingredients: [{
        name: "dark chocolate",
        qty: "1 g"
    }, {
        name: "milk",
        qty: "2 g"
    }, {
        name: "unsalted butter",
        qty: "3 g"
    }]
}

次のようなすべてのレシピを見つけるにはどうすればよいですか。

  • 名前にミルクまたはチョコレートが含まれている成分を持っている
  • しかし、ミルクもチョコレートも含まない他の成分は含まれていませんか?

上記の例は、そのクエリと一致しません。

概要:ミルク、チョコレート、またはその両方を含むすべてのレシピが必要ですが、それ以外は必要ありません。

4

1 に答える 1

2

ミルクまたはチョコレートを含まないドキュメントを検索する正規表現を使用して(ここのテクニックを使用)、それを a で否定すると、トリックが実行されます。ingredients$not

db.recipes.find({'ingredients.name': {$not: /^((?!(milk|chocolate)).)*$/}})

に対してテスト:

{
  "_id": ObjectId("5114f7b748994465c5b5c369"),
  "name": "Recipe 1",
  "ingredients": [
    {
      "name": "dark chocolate",
      "qty": "1 g"
    },
    {
      "name": "milk",
      "qty": "2 g"
    },
    {
      "name": "unsalted butter",
      "qty": "3 g"
    }
  ]
}
{
  "_id": ObjectId("5114f9f348994465c5b5c36a"),
  "name": "Recipe 2",
  "ingredients": [
    {
      "name": "dark chocolate",
      "qty": "1 g"
    },
    {
      "name": "milk",
      "qty": "2 g"
    }
  ]
}
{
  "_id": ObjectId("5114fcec48994465c5b5c36b"),
  "name": "Recipe 3",
  "ingredients": [
    {
      "name": "milk chocolate",
      "qty": "1 g"
    }
  ]
}
{
  "_id": ObjectId("5114fd0e48994465c5b5c36c"),
  "name": "Recipe 4",
  "ingredients": [
    {
      "name": "soy",
      "qty": "1 g"
    }
  ]
}
{
  "_id": ObjectId("5114fd5248994465c5b5c36d"),
  "name": "Recipe 5",
  "ingredients": [
    {
      "name": "chocolate mud",
      "qty": "1 g"
    }
  ]
}

以下を出力します。

{
  "_id": ObjectId("5114f9f348994465c5b5c36a"),
  "name": "Recipe 2",
  "ingredients": [
    {
      "name": "dark chocolate",
      "qty": "1 g"
    },
    {
      "name": "milk",
      "qty": "2 g"
    }
  ]
}
{
  "_id": ObjectId("5114fcec48994465c5b5c36b"),
  "name": "Recipe 3",
  "ingredients": [
    {
      "name": "milk chocolate",
      "qty": "1 g"
    }
  ]
}
{
  "_id": ObjectId("5114fd5248994465c5b5c36d"),
  "name": "Recipe 5",
  "ingredients": [
    {
      "name": "chocolate mud",
      "qty": "1 g"
    }
  ]
}
于 2013-02-08T13:33:05.123 に答える