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

MongoDBelemMatchが期待どおりに機能しない

    $elemMatchの動作に問題はありません 。期待どおりに動作します。ドキュメントには次のようにも書かれています:

    経験則として、arrayを投影するときはいつでも $elemMatchを使用する 、1つだけ の要素は最大で投影されます 。配列内のどの要素も一致しない場合、フィールドはまったく投影されません。

    したがって、得られる結果は正しく、$elemMatchの条件に一致する配列の最初のアイテムのみです。 projectedされます 。

    {
        "_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
        "Statuses" : [{
            ....
            "StatusID": NumberLong(525623822633172993),
            ....
        }]
    }
    

    statuss配列内のドキュメントの順序を変更してみてください。そのドキュメントが配列内の他の一致するドキュメントよりも前に表示される場合は、別の一致するドキュメントを取得する可能性があります。

    参照: $ elemMatch

    要件に応じて、一致するすべての配列要素を結果に含める場合は、集計操作を実行する必要があります。

    • Match 必要な_idを持つドキュメントと、検索しているステータスサブドキュメントを含むドキュメント。
    • unwind ステータス配列。
    • もう一度match 巻き戻された個々のドキュメント。
    • 最後にgroup _idによって一致したドキュメント 。

    コード:

    db.collection.aggregate([
    {$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
              "Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
    {$unwind:"$Statuses"},
    {$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
    {$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
    ])
    

    これにより、配列内の一致するすべてのサブドキュメントが提供されます。



    1. redisまたはmongodbを使用してユーザー情報を保存する

    2. MongoDBを使用して、フィールドの値に関係なく、フィールドを持つすべてのドキュメントを検索するにはどうすればよいですか?

    3. $toLowerを使用してMongoDBコレクションを更新します

    4. MongoError:ローカルホストへの接続0:27017がタイムアウトしました