Green 绿色
Green 绿色

Reputation: 2886

MongoDB: Find and then modify the resulting object

is it possible in MongoDB to find some objects that match a query and then to modify the result without modifying the persistent data?

For example, let

students = [
  { name: "Alice", age: 25 }, 
  { name: "Bob",  age: 22 }, 
  { name: "Carol", age: 19 }, 
  { name: "Dave", age: 18}
]

Now, I want to query all students that are younger than 20 and in the search result, I just want to replace "age: X" with "under20: 1" resulting in the following:

result = [
  { name: "Carol", under20: 1 }, 
  { name: "Dave", under20: 1}
]

without changing anything in the database.

Sure, it is possible to get the result and then call a forEach on it, but that sounds so inefficient because I have to rerun every object again, so I'm searching for an alternative. Or is there no one?

Upvotes: 0

Views: 270

Answers (1)

hmjd
hmjd

Reputation: 121971

A possible solution would be to use an aggregation pipline with a $match followed by a $project:

db.students.aggregate(
[
    {
        $match: { age: { $lt: 20 } }
    },
    {
        $project:
        {
            _id: false,
            name: true,
            under20: { $literal: 1 }
        }
    }
]);

The $literal: 1 is required as just using under20: 1 is the same as under20: true, requesting that field under20 be included in the result: which would fail as under20 does not exist in the document produced by the match.

Or to return all documents in students and conditionally generate the value for under20 a possible solution would be to use $cond:

db.students.aggregate(
[
    {
        $project:
        {
            _id: false,
            name: true,
            under20:
            {
                $cond: { if: { $lt: [ "$age", 20 ] }, then: 1, else: 0 }
            }
        }
    }
]);

Upvotes: 2

Related Questions