2

MongoDB ではサブドキュメントをフィルタリングする方法がないため (参考:MongoDB でサブドキュメントを選択する方法)

以下の例のフィールドを持たない、指定されたフィールドを持たないフィールドをすばやく削除/フィルタリングするための別の方法/メソッドは MongoDB 内にありsubdocumentますか?

mongodb の外部で結果を処理し、すべての空のドキュメントを除外することによってこれを行う唯一の方法はありますか?

(さまざまなスキーマを持つ 1000 のサブドキュメントがある状況を想像してみてください。私は .find() を実行して 1000 のサブドキュメントを取得しましたが、900 は空です。100 を取得したいだけなので、常に処理する必要はありません。空のものは MongoDB の外にドロップしてください。)

たとえば、次の JSON があるとしますcollection named monday

{
document : [
            {
             subdocument : "Hello World"
            },
            {
             subdocument : "Hello Moon"
            },
            {
             another_field: "Hello Sun"
            }
            ]
}

そして、あなたはこのクエリを作成しますdb.monday.find({},{_id:0,"document.subdocument":1})

結果は次のようになります。

    { "document" : [    
    {   "subdocument" : "Hello World" },    
    {   "subdocument" : "Hello Moon" },     
    {    } 
    ] }

空であるにもかかわらず、another_field がまだ返されていることがわかります。

4

1 に答える 1

2

ドキュメントは配列であり、Mongodb は要素の配列インデックスを変更したくないため、この場合は空のフィールドが返されると思います。

集計フレームワークを使用して、サブドキュメントの配列を取得できます。

db.monday.aggregate(
  [
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $unwind: "$document" }, 
    { $match: 
      {'document.subdocument' : 
        { $exists: 1 }
      }
    },
    { $project: { subdocument: "$document.subdocument", _id: 0 } }
  ])

収量:

 [
    {
        "subdocument" : "Hello World"
    },
    {
        "subdocument" : "Hello Moon"
    }
 ]

最初の$matchものは必要ありません。探しているサブドキュメントを持たないドキュメントがたくさんある場合に、処理を高速化するだけです。

于 2013-05-27T17:05:54.490 に答える