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

Mongodbはサブ配列内を検索します

    あなたは正しい方向に進んでいますが、ネストされた配列(特に匿名キーを使用)は物事を格納するための優れた方法ではないという部分を除いて、ここで注意すべきことがいくつかありますが、常に位置を知っている限り、それはかなり大丈夫なはずです。

    一致するドキュメントには明確な違いがあります 一致する「配列の要素」 。現在の値は実際には一致しませんが(検索値はドキュメントの範囲内にありません)、値が実際に有効である場合、クエリは"ドキュメント"と正しく一致します。 ここには、配列内の一致する要素が含まれています。

    「ドキュメント」 すべてが含まれています 配列要素のうち、一致しないものも含まれますが、条件には "document" 一致するので、返されます。一致する"要素"だけが必要な場合 次に、 .aggregate()を使用します 代わりに:

        db.infos.aggregate([
            // Still match the document
            { "$match": { 
                "info": { 
                    "$elemMatch": { "0": {"$gte": 1399583285000} }
                }
            }},
    
            // unwind the array for the matched documents
            { "$unwind": "$info" },
    
            // Match only the elements
            { "$match": { "info.0": { "$gte": 1399583285000 } } },
    
            // Group back to the original form if you want
            { "$group": {
                "_id": "$_id",
                "info": { "$push": "$info" }
            }}
    
        ])
    

    そして、それは条件に一致した要素だけを返します:

    {
        "_id" : ObjectId("536c1145e99dc11e65ed07ce"),
        "info" : [
                [
                        1399583285000,
                        20.13
                ],
                [
                        1399583286000,
                        20.13
                ]
        ]
    }
    

    または、1つしか期待していなかった場合はもちろん 要素を一致させる場合は、で投影を使用できます。 .find() **:

    db.infos.find(
        {
           "info":{
              "$elemMatch":{
                 "0": {
                    "$gt": 1399583285000
                 }
              }
           }
        },
        {
            "info.$": 1
        }
    )
    

    しかし、 $gtのような用語で ドキュメント内で複数のヒットが発生する可能性が高いため、位置的な$を考慮すると、集計アプローチの方が安全です。 演算子は最初ののみを返します 一致します。




    1. MongoDBコレクションドキュメントを自動的にエージングアウトします

    2. 以前のバージョンのmongodbをhomebrewでインストールするにはどうすればよいですか?

    3. 使用可能なすべてのキーを取得するためのRedisコマンド?

    4. PHPとMongoDBの使用開始