sql >> データベース >  >> NoSQL >> MongoDB

特定のフィールドを持つドキュメントを含む配列を持つドキュメントを検索する

    $ whereを使用する オペレーター。

    db.collection.find(function() { 
        return this.docs.length === this.docs.filter(function(doc) {
            return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length 
    })
    

    これを行う別の方法は、2つのクエリを実行することです。1つは _idを取得するためのクエリです。 distinct() 方法:

    var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
    

    次に、 $ ninを使用します 演算子を使用して、条件に一致するすべてのドキュメントを返します。

    db.collection.find({ "_id": { "$nin": unwantedIds } } )
    

    <を使用することもできます。 code> .aggregate() メソッドですが、これはバージョン3.2以降を使用している場合にのみ機能します。これは、 $ filter

    パイプラインの最初の段階は、 $ matchです。 「foo」フィールドがないドキュメントを除外するステージ。これにより、パイプで処理されるドキュメントの総数が減ります。次の最後の段階は、 $ redactです。 ステージ。この段階では、 $ sizeを使用する必要があります 演算子を使用して、「docs」フィールドのサイズと「foo」が存在するサブドキュメントの配列のサイズを返し、2つの値が等しいすべてのドキュメントを返します。

    db.collection.aggregate([
        { "$match": { "docs.foo": { "$exists": true } } }, 
        { "$redact": { 
            "$cond": [ 
                { "$eq": [ 
                    { "$size": "$docs" }, 
                    { "$size":  { 
                        "$filter": { 
                            "input": "$docs", 
                            "as": "doc", 
                            "cond": { 
                                "$ne": [ 
                                    { "$ifNull": [ "$$doc.foo", null ] },
                                    null 
                                ] 
                            } 
                        }
                    }}
                ]}, 
                "$$KEEP", 
                "$$PRUNE"
            ]
        }}
    ])
    



    1. MongoDBjsonSchema検証additionalProperties

    2. mongo dbを開始できません、initandlisten例外

    3. モンゴ+乗客:レール内からデータベースに再接続する正しい方法は?最適なモンゴパフォーマンスを確保する方法は?

    4. forEachはmongodbのすべてのコレクションを反復処理しません