[解決済み] MongoDB: 配列のフィールドに要素があるかどうかを調べるには?
質問
2つのコレクションがあります。 最初のコレクションは、学生を含んでいます。
{ "_id" : ObjectId("51780f796ec4051a536015cf"), "name" : "John" }
{ "_id" : ObjectId("51780f796ec4051a536015d0"), "name" : "Sam" }
{ "_id" : ObjectId("51780f796ec4051a536015d1"), "name" : "Chris" }
{ "_id" : ObjectId("51780f796ec4051a536015d2"), "name" : "Joe" }
2番目のコレクションにはコースが含まれています。
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
"name" : "CS 101",
"students" : [
ObjectId("51780f796ec4051a536015cf"),
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d2")
]
}
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc5"),
"name" : "Literature",
"students" : [
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d0"),
ObjectId("51780f796ec4051a536015d2")
]
}
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
ObjectId("51780f796ec4051a536015cf"),
ObjectId("51780f796ec4051a536015d0")
]
}
各コースドキュメントには
students
配列が含まれます。これはコースに登録された学生のリストを持っています。 学生がウェブページでコースを閲覧する場合、すでにコースに登録されているかどうか確認する必要があります。 それを行うために
courses
コレクションが学生のためにクエリされるとき、私たちは以下のことを見つける必要があります。
students
配列がすでに学生の ObjectId を含んでいるかどうかを調べる必要があります。 検索クエリのプロジェクションで、生徒の
ObjectId
から
students
配列がある場合のみ?
elemMatch演算子ができないか試してみましたが、サブドキュメントの配列向けです。 集計フレームワークを使用できることは理解していますが、この場合、それは過剰になるように思われます。 集約フレームワークはおそらく単一の検索クエリほど高速ではないでしょう。 返されたドキュメントがこのようなフォームになるように、コースコレクションにクエリを実行する方法はありますか?
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc4"),
"name" : "CS 101",
"students" : [
ObjectId("51780f796ec4051a536015d0"),
]
}
どのように解決するのですか?
[ 編集 最近のバージョンで可能になったことに基づく] 。
[更新された回答】以下の方法で、すでに登録されている場合のみ、クラス名と学生IDを取得することができます。
db.student.find({},
{_id:0, name:1, students:{$elemMatch:{$eq:ObjectId("51780f796ec4051a536015cf")}}})
と入力すれば、期待通りの結果が返ってきます。
{ "name" : "CS 101", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
{ "name" : "Literature" }
{ "name" : "Physics", "students" : [ ObjectId("51780f796ec4051a536015cf") ] }
[当初の回答] 現在、あなたがやりたいことはできません。 生徒がオブジェクトとして配列に格納されていれば、このようなことが可能になるため、これは残念なことです。 実際、あなたがObjectId()だけを使用していることに少し驚きました。 常に を使用すると、特定のコースに登録されている学生のリストを表示したい場合、学生を検索する必要があります (最初に ID のリストを検索してから、学生コレクションで名前を検索します - 1 つのクエリではなく 2 つのクエリです!)。
(例として) IDと名前をこのようなコース配列に保存していたとします。
{
"_id" : ObjectId("51780fb5c9c41825e3e21fc6"),
"name" : "Physics",
"students" : [
{id: ObjectId("51780f796ec4051a536015cf"), name: "John"},
{id: ObjectId("51780f796ec4051a536015d0"), name: "Sam"}
]
}
その時のクエリーは、単純に
db.course.find( { },
{ students :
{ $elemMatch :
{ id : ObjectId("51780f796ec4051a536015d0"),
name : "Sam"
}
}
}
);
もしその学生がCS101にしか在籍していなかったら......取り返しがつかないことになります。
{ "name" : "Literature" }
{ "name" : "Physics" }
{
"name" : "CS 101",
"students" : [
{
"id" : ObjectId("51780f796ec4051a536015cf"),
"name" : "John"
}
]
}
関連
-
[解決済み】MongoError: 最初の接続でサーバー [localhost:27017] への接続に失敗しました。
-
[解決済み】MongoDBシェルですべてのコレクションを一覧表示するには?
-
[解決済み] 配列フィールドが空でない MongoDB レコードを検索する
-
[解決済み] or' 条件を含む MongoDB クエリ
-
[解決済み] mongooseを使ってmongodbにドキュメントを挿入し、生成されたidを取得する方法は?
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み] 特定の値を含む配列で文書を検索する
-
[解決済み] フィールドに文字列が含まれているかどうかをチェックする
-
[解決済み】MongoDB コレクションの変更をリッスンする方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] mongodの書き込みに関するデフォルトの懸念はどのバージョンにありますか?
-
[解決済み] MongoDBと同等ではない
-
[解決済み] MongoDBでフィールドが存在することを確認する
-
[解決済み] SocketException: アドレスはすでに使用中です MONGODB
-
[解決済み】mongoコンソールでObjectIdを使用してオブジェクトを検索する方法は?
-
[解決済み] MongoDB SELECT COUNT GROUP BY
-
[解決済み] 値が NULL ではないマングースクエリ
-
[解決済み] Mongoose Unique インデックスが機能しない!
-
[解決済み] MongoDB: フィールドがNULLまたは未設定のレコードを検索するには?
-
[解決済み] mongodb の複数の配列アイテムによる検索