way to update multiple documents with different values

后端 未结 4 1107
再見小時候
再見小時候 2021-01-17 08:41

I have the following documents:

[{
  \"_id\":1,
  \"name\":\"john\",
  \"position\":1
},
 {\"_id\":2,
  \"name\":\"bob\",
  \"position\":2
},
 {\"_id\":3,
           


        
相关标签:
4条回答
  • 2021-01-17 08:58

    From mongodb 4.2 you can do using pipeline in update using $set operator

    there are many ways possible now due to many operators in aggregation pipeline though I am providing one of them

        exports.updateDisplayOrder = async keyValPairArr => {
        try {
            let data = await ContestModel.collection.update(
                { _id: { $in: keyValPairArr.map(o => o.id) } },
                [{
                    $set: {
                        displayOrder: {
                            $let: {
                                vars: { obj: { $arrayElemAt: [{ $filter: { input: keyValPairArr, as: "kvpa", cond: { $eq: ["$$kvpa.id", "$_id"] } } }, 0] } },
                                in:"$$obj.displayOrder"
                            
                            }
                        }
                    }
                }],
                { runValidators: true, multi: true }
            )
    
            return data;
        } catch (error) {
            throw error;
        }
       }
    

    example key val pair is [{"id":"5e7643d436963c21f14582ee","displayOrder":9}, {"id":"5e7643e736963c21f14582ef","displayOrder":4}]

    0 讨论(0)
  • 2021-01-17 08:59

    Since MongoDB 4.2 update can accept aggregation pipeline as second argument, allowing modification of multiple documents based on their data.

    See https://docs.mongodb.com/manual/reference/method/db.collection.update/#modify-a-field-using-the-values-of-the-other-fields-in-the-document

    Excerpt from documentation:

    Modify a Field Using the Values of the Other Fields in the Document

    Create a members collection with the following documents:

    db.members.insertMany([
      { "_id" : 1, "member" : "abc123", "status" : "A", "points" : 2, "misc1" : "note to self: confirm status", "misc2" : "Need to activate", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") },
      { "_id" : 2, "member" : "xyz123", "status" : "A", "points" : 60, "misc1" : "reminder: ping me at 100pts", "misc2" : "Some random comment", "lastUpdate" : ISODate("2019-01-01T00:00:00Z") }
    ])
    

    Assume that instead of separate misc1 and misc2 fields, you want to gather these into a new comments field. The following update operation uses an aggregation pipeline to:

    • add the new comments field and set the lastUpdate field.
    • remove the misc1 and misc2 fields for all documents in the collection.
    db.members.update(
      { },
      [
         { $set: { status: "Modified", comments: [ "$misc1", "$misc2" ], lastUpdate: "$$NOW" } },
         { $unset: [ "misc1", "misc2" ] }
      ],
      { multi: true }
    )
    
    0 讨论(0)
  • 2021-01-17 09:09

    You can use db.collection.bulkWrite() to perform multiple operations in bulk. It has been available since 3.2.

    It is possible to perform operations out of order to increase performance.

    0 讨论(0)
  • 2021-01-17 09:16

    You can not update two documents at once with a MongoDB query. You will always have to do that in two queries. You can of course set a value of a field to the same value, or increment with the same number, but you can not do two distinct updates in MongoDB with the same query.

    0 讨论(0)
提交回复
热议问题