1

次のようなレシピのコレクションがあります。

{
  "Name": "Omelet",
  "Ingredients": ["Eggs", "Milk", "Butter"]
},
{
  "Name": "Pancakes",
  "Ingredients": ["Eggs", "Milk", "Butter", "Flour", "Sugar", "Salt"]
},
{
  "Name": "Random recipe",
  "Ingredients": ["Eggs", "Milk"]
}

クエリに完全に含まれる食材を使用したレシピを取得しようとしています。たとえば、クエリに卵、牛乳、バターがある場合、上記のコレクションからオムレツと「ランダム レシピ」を取得する必要がありますが、パンケーキは必要ありません。卵と牛乳しかない場合は、「ランダムなレシピ」のみを返す必要があります。つまり、手に入る材料で作れるレシピだけが欲しい。ドキュメントを検索しましたが、これをどのように実装する必要があるかを正確に見つけることができませんでした。何か案は?バックエンドにGolangを使っているので、例を書いていただけると助かります。どんな助けにも感謝します。

今のところ、特定の材料を含むすべてのレシピを返すこの関数を作成しましたが、不足している材料や、転送されたすべての材料を必要としないレシピは考慮されていません。

func GetTestRecipesFromDB(ingredients []string) *[]Recipe {
    collection := client.Database("food_db").Collection("recipes")

    ctx, _ := context.WithTimeout(context.Background(), 10 * time.Second)

    var recipes []Recipe
    var cursor *mongo.Cursor

    cursor, err := collection.Find(ctx, bson.D{
        {"Ingredients", bson.D{{"$all", ingredients}}},
    })

    if err != nil {
        log.Fatal(err)
        return nil
    }

    if err = cursor.All(ctx, &recipes); err != nil {
        log.Fatal(err)
        return nil
    }

    return &recipes
}

編集:この回答(提案のためのthx @MontgomeryWatts)によると、私はこれをGoで書きましたが、動作します:

    query := bson.M{
        "$match" : bson.M{
            "$expr" : bson.M{
                "$setIsSubset": []interface{}{
                    "$Ingredients",
                    ingredients,
                },
            },
        },
    }

    cursor, err := collection.Aggregate(ctx, []bson.M{query})
    if err != nil {
        log.Fatal(err)
        return nil
    }

助けてくれてありがとう!

4

2 に答える 2