[解決済み] MongoDBでサブドキュメントの配列をフィルタリングする方法 [重複] (英語)
2022-08-17 05:20:50
質問
サブドキュメントに以下のような配列があります。
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
サブドキュメントは、> 3 のためにフィルタリングできますか?
私の期待する結果は以下の通りです。
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 4
},
{
"a" : 5
}
]
}
を使おうとすると
$elemMatch
を使っていますが,配列の最初にマッチする要素を返します。
私のクエリ
db.test.find( { _id" : ObjectId("512e28984815cbfcb21646a7") }, {
list: {
$elemMatch:
{ a: { $gt:3 }
}
}
} )
結果は、配列の1つの要素を返します。
{ "_id" : ObjectId("512e28984815cbfcb21646a7"), "list" : [ { "a" : 4 } ] }
で集約を行おうとすると
$match
を使っていますが、うまくいきません。
db.test.aggregate({$match:{_id:ObjectId("512e28984815cbfcb21646a7"), 'list.a':{$gte:5} }})
配列の全要素を返します。
{
"_id" : ObjectId("512e28984815cbfcb21646a7"),
"list" : [
{
"a" : 1
},
{
"a" : 2
},
{
"a" : 3
},
{
"a" : 4
},
{
"a" : 5
}
]
}
配列の要素をフィルタリングして、期待通りの結果を得ることはできますか?
どのように解決するのですか?
使用方法
aggregate
を使うのは正しい方法ですが、そのためには
$unwind
は
list
の配列を適用する前に
$match
を適用することで、個々の要素にフィルタをかけてから
$group
を使って元に戻すことができます。
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $unwind: '$list'},
{ $match: {'list.a': {$gt: 3}}},
{ $group: {_id: '$_id', list: {$push: '$list.a'}}}
])
の出力があります。
{
"result": [
{
"_id": ObjectId("512e28984815cbfcb21646a7"),
"list": [
4,
5
]
}
],
"ok": 1
}
MongoDB 3.2アップデート
3.2 リリースから、新しい
$filter
を含むだけで、より効率的にこれを行うことができます。
list
の間に必要な要素のみを含めることで効率的に
$project
:
db.test.aggregate([
{ $match: {_id: ObjectId("512e28984815cbfcb21646a7")}},
{ $project: {
list: {$filter: {
input: '$list',
as: 'item',
cond: {$gt: ['$$item.a', 3]}
}}
}}
])
関連
-
[解決済み】SocketException: アドレスはすでに使用中です。
-
[解決済み] 配列のサイズが1より大きい文書を検索します。
-
[解決済み] mongodの書き込みに関するデフォルトの懸念はどのバージョンにありますか?
-
[解決済み] ネストされた配列の中で、マッチしたサブドキュメントの要素のみを返す
-
CentOS7に新規インストールしたMongodbの初期設定
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] コマンドラインからMongoDBデータベースを削除する方法を教えてください。
-
[解決済み] 別のフィールドの値を使って MongoDB のフィールドを更新する
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] E: mongodb-org パッケージが見つかりません。
-
[解決済み] Mongodb find() クエリ : ユニークな値だけを返す (重複はしない) [duplicate].
-
[解決済み] MongoDB - 管理者ユーザが認証されていない
-
[解決済み] mongo - サーバー 127.0.0.1:27017 に接続できませんでした。
-
[解決済み] mongoDB の文字列フィールドの値の長さ
-
[解決済み] mongodb Failed: error connecting to db server: no reachable servers
-
[解決済み] MongoDB コレクションのオブジェクト配列で、問い合わせた要素のみを取得する
-
[解決済み】MongoDBで整数を挿入しようとすると、浮動小数点が挿入される。
-
[解決済み】Node.js Mongoose.js の文字列を ObjectId に変換する関数
-
[解決済み】RedisはmongoDBよりどれくらい速いのか?