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

存在する場合は多数を更新し、存在しない場合は、存在しないLeadIdごとに新しいドキュメントを作成します

    .updateMany()を実行しているため、クエリから 、{ multi: true }を実行する必要はありません 。とにかく、通常は{upset: true}を使用してアップサートを行うことができます 、ただし、DBで一致するものが見つからない場合にのみ、入力クエリからの更新フィールドを使用してフィルター基準に基づいて新しいドキュメントを作成するのが理想的です。しかし、ここにリストがあります($in )フィルター基準では、正常に機能しない可能性があります。これを試してください:

    let winnerLeads = [1, 2, 3, 31, 5]
    let groupTarget = 1
    let howManyClaims = 2
    let bulkArr = []
    for (i of winnerLeads) {
        bulkArr.push({
            updateOne: {
                "filter": {
                    LeadId: i,
                    TargetedToBeClaimedByClientType: groupTarget
                },
                // If you wanted it to be incremented rather than replace the field, then try `$inc` instead of `$set`.
                "update": { $set: { TotalClaimsToBeClaimedByClientType: howManyClaims } },
                "upsert": true
            }
        })
    }
    db.EightWeekGamePlan.bulkWrite(bulkArr);
    

    収集データ:

    /* 1 */
    {
        "_id" : ObjectId("5e06eb8f400289966e00fac2"),
        "LeadId" : 1,
        "TotalClaimsToBeClaimedByClientType" : 1.0,
        "TargetedToBeClaimedByClientType" : 1
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5e06eb98400289966e00fb88"),
        "LeadId" : 2,
        "TotalClaimsToBeClaimedByClientType" : 1.0,
        "TargetedToBeClaimedByClientType" : 1
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5e06eba0400289966e00fc47"),
        "LeadId" : 3,
        "TotalClaimsToBeClaimedByClientType" : 0,
        "TargetedToBeClaimedByClientType" : 11
    }
    
    /* 4 */
    {
        "_id" : ObjectId("5e06ebac400289966e00fd4b"),
        "LeadId" : 4,
        "TotalClaimsToBeClaimedByClientType" : 1,
        "TargetedToBeClaimedByClientType" : 11
    }
    
    /* 5 */
    {
        "_id" : ObjectId("5e06ecef400289966e01273a"),
        "LeadId" : 5,
        "TotalClaimsToBeClaimedByClientType" : 1.0,
        "TargetedToBeClaimedByClientType" : 1
    }
    

    結果:

    /* 1 */
    {
        "_id" : ObjectId("5e06eb8f400289966e00fac2"),
        "LeadId" : 1,
        "TotalClaimsToBeClaimedByClientType" : 2.0,
        "TargetedToBeClaimedByClientType" : 1
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5e06eb98400289966e00fb88"),
        "LeadId" : 2,
        "TotalClaimsToBeClaimedByClientType" : 2.0,
        "TargetedToBeClaimedByClientType" : 1
    }
    
    /* 3 */
    {
        "_id" : ObjectId("5e06eba0400289966e00fc47"),
        "LeadId" : 3,
        "TotalClaimsToBeClaimedByClientType" : 0,
        "TargetedToBeClaimedByClientType" : 11
    }
    
    /* 4 */
    {
        "_id" : ObjectId("5e06ebac400289966e00fd4b"),
        "LeadId" : 4,
        "TotalClaimsToBeClaimedByClientType" : 1,
        "TargetedToBeClaimedByClientType" : 11
    }
    
    /* 5 */
    {
        "_id" : ObjectId("5e06ecef400289966e01273a"),
        "LeadId" : 5,
        "TotalClaimsToBeClaimedByClientType" : 2,
        "TargetedToBeClaimedByClientType" : 1
    }
    
    /* 6 */
    {
        "_id" : ObjectId("5e071eb1400289966e0597a0"),
        "TargetedToBeClaimedByClientType" : 1.0,
        "LeadId" : 3.0,
        "TotalClaimsToBeClaimedByClientType" : 2.0
    }
    
    /* 7 */
    {
        "_id" : ObjectId("5e071e62400289966e059168"),
        "TargetedToBeClaimedByClientType" : 1.0,
        "LeadId" : 31.0,
        "TotalClaimsToBeClaimedByClientType" : 2.0
    }
    

    基本的にbulkWriteは書き込み結果以外のドキュメントを返しません。DBで更新操作の結果を確認できます。上記の結果からも6 LeadId : 3 + TargetedToBeClaimedByClientType" : 1.0として挿入されました (つまり、LeadId:3 重複している)組み合わせがDBと7に存在しない LeadId : 31として挿入されました DBに存在せず、残りの125TotalClaimsToBeClaimedByClientType 更新されました。

    参照: bullkWrite




    1. センチネルでRedisをアップグレードするためのベストプラクティス?

    2. mongoreduce関数の2つのフィールドのカウントと一意のカウントを計算する方法

    3. RedisとMongoDB:知っておくべきこと

    4. MongoDBをスケーリングする方法は?