亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何從數據庫中篩選配方?

如何從數據庫中篩選配方?

Go
大話西游666 2022-08-15 15:37:19
我有一個食譜集合,看起來像這樣:{  "Name": "Omelet",  "Ingredients": ["Eggs", "Milk", "Butter"]},{  "Name": "Pancakes",  "Ingredients": ["Eggs", "Milk", "Butter", "Flour", "Sugar", "Salt"]},{  "Name": "Random recipe",  "Ingredients": ["Eggs", "Milk"]}我正在嘗試獲取包含完全包含在查詢中的成分的食譜。例如,如果我有雞蛋,牛奶和黃油,那么我必須從上面的收集中獲得煎蛋卷和“隨機食譜”,但不是煎餅,因為我沒有其他3種必要的成分。如果我只有雞蛋和牛奶,那么它必須只返回“隨機配方”。換句話說,我只想要可以用可用成分制作的食譜。我搜索了文檔,但找不到應該如何實現它。有什么想法嗎?我正在使用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    }感謝大家的幫助!
查看完整描述

2 回答

?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

可以使用聚合管道實現此目的,$filter

  • $match,以便您只考慮至少具有一種匹配成分的食譜

  • $addFields使用$filter創建字段,以消除從中查詢的成分數組OtherIngredientIngredients

  • $match只選擇沒有其他不良成分的食譜

  • $project刪除臨時字段

[

  {$match: {Ingredients: {

        $in: ["Eggs","Milk","Butter"]

  }}},

  { $addFields: {

      OtherIngredient: {

        $filter: {

          input: "$Ingredients",

          cond: {$not: {$in: [

                "$$this",

                ["Eggs","Milk","Butter"]

          ]}}

        }

      }

  }},

  {$match: {"OtherIngredient": []}},

  {$project: {OtherIngredient: 0}}

])


查看完整回答
反對 回復 2022-08-15
?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

對不起,我不知道Golang,但這是你需要的(是新的MongoDB 4.4):$function


let filter = ["Eggs", "Milk", "Butter"];


db.recipes.find({

    $expr: {

        $function: {

            body: function(ingredients, filter) {


                for (let i = 0; i < ingredients.length; i++) {

                    if (filter.indexOf(ingredients[i]) < 0) return false;

                }


                return true

            },

            args: ["$Ingredients", filter],

            lang: "js"

        }

    }

});


查看完整回答
反對 回復 2022-08-15
  • 2 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號