ericsoco
ericsoco

Reputation: 26303

MongoDB: Modify each document on server

Given a large (millions+) collection of documents similar to:

{ _id : ObjectId, "a" : 3, "b" : 5 }

What is the most efficient way to process these documents directly on the server, with the results added to each document within the same collection? For example, add a key c whose value equals a+b.

{ _id : ObjectId, "a" : 3, "b" : 5, "c" : 8 }

I'd prefer to do this in the shell.

Seems that find().forEach() would waste time in transit between the db and the shell, and mapReduce() seems intended to process groups of objects down into aggregated data (though I may be misunderstanding).

EDIT: I'd prefer a solution that doesn't block, if there is one (other than using a cursor on the client)...

Upvotes: 0

Views: 195

Answers (2)

Shaun
Shaun

Reputation: 284

From the MongoDB Docs on db.eval():

"db.eval() is used to evaluate a function (written in JavaScript) at the database server. This is useful if you need to touch a lot of data lightly. In that scenario, network transfer of the data could be a bottleneck."

The documentation has an example of how to use it that is very similar to what you are trying to do.

Upvotes: 2

Eve Freeman
Eve Freeman

Reputation: 33175

forEach is your best option. I would run it on the server (from the shell) to reduce latency.

Upvotes: 1

Related Questions