[DOCS-10316] Docs for SERVER-24879: Add $mergeObjects aggregation expression Created: 25/May/17  Updated: 29/Oct/23  Resolved: 26/Jul/17

Status: Closed
Project: Documentation
Component/s: Server
Affects Version/s: None
Fix Version/s: 3.5.6

Type: Task Priority: Major - P3
Reporter: Emily Hall Assignee: Kay Kim (Inactive)
Resolution: Fixed Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Issue Links:
Documented
documents SERVER-24879 Add $mergeObjects aggregation expression Closed
Participants:
Days since reply: 6 years, 29 weeks ago
Epic Link: DOCS: 3.6 Server

 Description   

Documentation Request Summary:

New aggregation expression (that's also an accumulator).

Engineering Ticket Description:

Syntax

{$mergeObjects: [<expression 1>, <expression 2>, ..., <expression N>]}

Examples

// 1. Merging two objects together
db.merging.insert({_id: 0, subObject: {b: 1, c: 1}})
db.merging.aggregate([{$project: {newDocument: {$mergeObjects: ["$subObject", {d: 1}]}}}]);
// Results:
{_id: 0, newDocument: {b: 1, c: 1, d: 1}}
 
// 2. Merging the root with a new field
db.merging.insert({_id: 0, field0: 0, field1: 1})
db.merging.aggregate([{$project: {newDocument: {$mergeObjects: ["$$ROOT", {newField: "newValue"}]}}}]);
// Results:
{_id: 0, newDocument: {_id: 0, field0: 0, field1: 1, newField: "newValue"}}
 
// 3. Replacing a field in the root.
db.merging.insert({_id: 0, field0: 0, field1: 1})
db.merging.aggregate([{$project: {newDocument: {$mergeObjects: ["$$ROOT", {field0: "newValue"}]}}}]);
// Results:
{_id: 0, newDocument: {_id: 0, field0: "newValue", field1: 1}}
 
// 4. Overriding in the opposite order
db.merging.insert({_id: 0, field0: 0, field1: 1})
db.merging.aggregate([{$project: {newDocument: {$mergeObjects: [{field0: "defaultValue"}, "$$ROOT"]}}}]);
// Results:
{_id: 0, newDocument: {_id: 0, field0: 0, field1: 1}}
 
db.merging.insert({_id: 0, field0: 0, subdoc: {a: 1, b: 3}})
db.merging.aggregate([{$replaceRoot: {newRoot: {$mergeObjects: ["$$ROOT", "$subdoc"]}}}])
// results:
{_id: 0, field0: 0, subdoc: {a: 1, b: 3}, a: 1, b: 3}

Detailed Behavior

  • The new expression will take any number of expressions
  • It will error if any expression does not evaluate to an object
  • If the field "x" exists in multiple objects, the value of "x" in the last document will win. Since it's an array, you can reverse the order if you wanted different overriding semantics.


 Comments   
Comment by Githook User [ 26/Jul/17 ]

Author:

{'email': 'kay.kim@10gen.com', 'username': 'kay-kim', 'name': 'kay'}

Message: DOCS-10316: 3.6 mergeObjects
Branch: master
https://github.com/mongodb/docs/commit/526e2db11518ddffc9ddf5024ff1ba64a187961a

Generated at Thu Feb 08 08:00:17 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.