web-dev-qa-db-ja.com

特定の値を含む配列で文書を探す

このスキーマがある場合.

person = {
    name : String,
    favoriteFoods : Array
}

... favoriteFoods配列は文字列で埋められます。どのようにマングースを使って好きな食べ物として「寿司」を持っているすべての人を見つけることができますか?

私は以下の方針に沿って何かを望んでいました。

PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});

(私は、mongodbに$containsがないことを知っています。解決策を知る前に、私が期待していたことを説明しているだけです)

404

favouriteFoodsは単純な文字列の配列なので、そのフィールドを直接問い合わせることができます。

PersonModel.find({ favouriteFoods: "sushi" }, ...);

しかし、私はまたあなたのスキーマで文字列配列を明示的にすることをお勧めします:

person = {
    name : String,
    favouriteFoods : [String]
}

関連文書はこちらにあります。 https://docs.mongodb.com/manual/tutorial/query-arrays/

577
JohnnyHK

Mongodbには$contains演算子はありません。

JohnnyHKからの回答をそのまま使用できます。 mongoが持っているものに最も近い例えは$inです、これを使うとあなたのクエリはこんな感じになります:

PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
125
Alistair Nelson

このような状況では$allがより適切であると思います。あなたが寿司の中にいる人を探しているならあなたはします:

PersonModel.find({ favoriteFood : { $all : ["sushi"] }, ...})

以下のように、もっと検索を絞り込むことができます。

PersonModel.find({ favoriteFood : { $all : ["sushi", "bananas"] }, ...})

$inはORのようなもので、$allはANDのようなものです。これをチェックしてください: https://docs.mongodb.com/manual/reference/operator/query/all/

66
Pobe

favouriteFoodsが次のようなオブジェクトの配列である場合など、配列にオブジェクトが含まれる場合

{
  name: 'Sushi',
  type: 'Japanese'
}

次のクエリを使用できます。

PersonModel.find({"favouriteFoods.name": "Sushi"});
37
Kfir Erez

あなたがサブ文書の配列の中にNULL要素を含む文書を見つける必要がある場合、私はかなりうまく機能するこのクエリを見つけました:

db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})

この問い合わせはこの投稿から取られたものです: null値を持つMongoDb問い合わせ配列

これは素晴らしい発見であり、私の最初の と間違った version(1つの要素を持つ配列に対してのみうまくいくことがわかった)よりもはるかにうまく機能します。

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})
30
Jesus Campon

Find()に同意することがあなたのユースケースで最も効果的です。それでも、大量のエントリのクエリを容易にし、特に新しいファイルをグループ化して作成するのに価値のある少数の結果を生成するための、集計フレームワークの$ matchはあります。

  PersonModel.aggregate([
            { 
                 "$match": { 
                     $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ]  }
             },
             { $project : {"_id": 0, "name" : 1} }
            ]);
2
Amitesh

Loopback 3では、与えられたすべての例は私にはうまくいきませんでした。あるいはとにかくREST AP​​Iを使うのと同じくらい速くはできませんでした。しかしそれは私が私が必要とした正確な答えを把握するのを助けました。

{"where":{"arrayAttribute":{ "all" :[String]}}}

1
Mark Ryan Orosa

JavaScriptで「含む」演算子のようなものを使いたい場合は、そのために常に正規表現を使用できます。

例えば。 「Bartolomew」という名前の顧客を検索したいとします。

async function getBartolomew() {
    const custStartWith_Bart = await Customers.find({name: /^Bart/ }); // Starts with Bart
    const custEndWith_lomew = await Customers.find({name: /lomew$/ }); // Ends with lomew
    const custContains_rtol = await Customers.find({name: /.*rtol.*/ }); // Contains rtol

    console.log(custStartWith_Bart);
    console.log(custEndWith_lomew);
    console.log(custContains_rtol);
}
0
Alingenomen

Lookup_food配列の場合は配列です。

match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}

ルックアップの場合、フード配列は文字列です。

match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}
0
user1538016