616

このスキーマがあれば...

person = {
    name : String,
    favoriteFoods : Array
}

...favoriteFoods配列に文字列が入力されます。マングースを使って、好きな食べ物が「寿司」である人をすべて見つけるにはどうすればよいですか?

私は次のようなことを望んでいました:

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

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

4

12 に答える 12

852

文字列の単純な配列であるため、そのfavouriteFoodsフィールドを直接クエリできます。

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

ただし、スキーマで文字列配列を明示的にすることもお勧めします。

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

関連ドキュメントはこちらにあります: https://docs.mongodb.com/manual/tutorial/query-arrays/

于 2013-08-09T14:18:58.543 に答える
34

サブドキュメントの配列内に NULL 要素を含むドキュメントを検索する必要がある場合は、次のクエリが非常にうまく機能することがわかりました。

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

このクエリは、次の投稿から取得したものです: Null 値を持つ MongoDb クエリ配列

それは素晴らしい発見であり、私自身の最初の間違ったバージョンよりもはるかにうまく機能します(要素が1つの配列に対してのみ正常に機能することが判明しました):

.find({
    'MyArrayOfSubDocuments': { $not: { $size: 0 } },
    'MyArrayOfSubDocuments._id': { $exists: false }
})
于 2015-09-08T10:29:12.430 に答える
-25

このトピックが古いことは承知していますが、同じ質問に疑問を抱く可能性のある将来の人々のために、別の信じられないほど非効率的な解決策が実行される可能性があります。

PersonModel.find({$where : 'this.favouriteFoods.indexOf("sushi") != -1'});

これにより、MongoDB によるすべての最適化が回避されるため、本番コードでは使用しないでください。

于 2014-05-06T19:32:11.277 に答える