このスキーマがある場合.
person = {
name : String,
favoriteFoods : Array
}
... favoriteFoods
配列は文字列で埋められます。どのようにマングースを使って好きな食べ物として「寿司」を持っているすべての人を見つけることができますか?
私は以下の方針に沿って何かを望んでいました。
PersonModel.find({ favoriteFoods : { $contains : "sushi" }, function(...) {...});
(私は、mongodbに$contains
がないことを知っています。解決策を知る前に、私が期待していたことを説明しているだけです)
favouriteFoods
は単純な文字列の配列なので、そのフィールドを直接問い合わせることができます。
PersonModel.find({ favouriteFoods: "sushi" }, ...);
しかし、私はまたあなたのスキーマで文字列配列を明示的にすることをお勧めします:
person = {
name : String,
favouriteFoods : [String]
}
関連文書はこちらにあります。 https://docs.mongodb.com/manual/tutorial/query-arrays/
Mongodbには$contains
演算子はありません。
JohnnyHKからの回答をそのまま使用できます。 mongoが持っているものに最も近い例えは$in
です、これを使うとあなたのクエリはこんな感じになります:
PersonModel.find({ favouriteFoods: { "$in" : ["sushi"]} }, ...);
このような状況では$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/
favouriteFoods
が次のようなオブジェクトの配列である場合など、配列にオブジェクトが含まれる場合
{
name: 'Sushi',
type: 'Japanese'
}
次のクエリを使用できます。
PersonModel.find({"favouriteFoods.name": "Sushi"});
あなたがサブ文書の配列の中にNULL要素を含む文書を見つける必要がある場合、私はかなりうまく機能するこのクエリを見つけました:
db.collection.find({"keyWithArray":{$elemMatch:{"$in":[null], "$exists":true}}})
この問い合わせはこの投稿から取られたものです: null値を持つMongoDb問い合わせ配列
これは素晴らしい発見であり、私の最初の と間違った version(1つの要素を持つ配列に対してのみうまくいくことがわかった)よりもはるかにうまく機能します。
.find({
'MyArrayOfSubDocuments': { $not: { $size: 0 } },
'MyArrayOfSubDocuments._id': { $exists: false }
})
Find()に同意することがあなたのユースケースで最も効果的です。それでも、大量のエントリのクエリを容易にし、特に新しいファイルをグループ化して作成するのに価値のある少数の結果を生成するための、集計フレームワークの$ matchはあります。
PersonModel.aggregate([ { "$match": { $and : [{ 'favouriteFoods' : { $exists: true, $in: [ 'sushi']}}, ........ ] } }, { $project : {"_id": 0, "name" : 1} } ]);
Loopback 3では、与えられたすべての例は私にはうまくいきませんでした。あるいはとにかくREST APIを使うのと同じくらい速くはできませんでした。しかしそれは私が私が必要とした正確な答えを把握するのを助けました。
{"where":{"arrayAttribute":{ "all" :[String]}}}
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);
}
Lookup_food配列の場合は配列です。
match_stage["favoriteFoods"] = {'$elemMatch': {'$in': lookup_food_array}}
ルックアップの場合、フード配列は文字列です。
match_stage["favoriteFoods"] = {'$elemMatch': lookup_food_string}