MongoDB Insert Document

MongoDB provides multiple methods for inserting documents, allowing you to insert single or multiple documents.

Insert Single Document

insertOne() Method

db.collection.insertOne(document, options)

Basic Example

// Insert single document
db.users.insertOne({
  name: "John",
  age: 25,
  email: "john@example.com",
  createdAt: new Date()
})

Return Result

{
  "acknowledged": true,
  "insertedId": ObjectId("65a1b2c3d4e5f6g7h8i9j0k1")
}

Insert Multiple Documents

insertMany() Method

db.collection.insertMany(documents, options)

Basic Example

// Insert multiple documents
db.users.insertMany([
  {
    name: "John",
    age: 25,
    email: "john@example.com"
  },
  {
    name: "Jane",
    age: 30,
    email: "jane@example.com"
  },
  {
    name: "Bob",
    age: 28,
    email: "bob@example.com"
  }
])

Return Result

{
  "acknowledged": true,
  "insertedIds": [
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k1"),
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k2"),
    ObjectId("65a1b2c3d4e5f6g7h8i9j0k3")
  ]
}

Insert Options

ordered Option

// ordered: true (default) - stop on error
db.users.insertMany([
  { name: "A" },
  { name: "B" },
  { _id: 1, name: "C" },
  { _id: 1, name: "D" }  // Duplicate _id, will error and stop
], { ordered: true })

// ordered: false - continue on error
db.users.insertMany([
  { name: "A" },
  { name: "B" },
  { _id: 1, name: "C" },
  { _id: 1, name: "D" }  // Duplicate _id, errors but continues
], { ordered: false })

writeConcern Option

db.users.insertOne(
  { name: "John", age: 25 },
  {
    writeConcern: {
      w: "majority",      // Wait for majority nodes
      j: true,            // Write to journal
      wtimeout: 5000      // Timeout in milliseconds
    }
  }
)

Specifying _id Field

Custom _id

// Use string as _id
db.users.insertOne({
  _id: "user_001",
  name: "John",
  age: 25
})

// Use number as _id
db.products.insertOne({
  _id: 1001,
  name: "iPhone",
  price: 999
})

Compound _id

db.orders.insertOne({
  _id: {
    orderNo: "ORD2024001",
    sequence: 1
  },
  customer: "John",
  amount: 1000
})

Inserting Nested Documents

Basic Nesting

db.users.insertOne({
  name: "John",
  address: {
    street: "123 Main St",
    city: "New York",
    zipCode: "10001"
  },
  contacts: {
    phone: "555-0123",
    email: "john@example.com"
  }
})

Array Nesting

db.products.insertOne({
  name: "iPhone 15 Pro",
  colors: ["Black", "White", "Blue"],
  specs: [
    { type: "Storage", value: "256GB" },
    { type: "Screen", value: "6.1 inches" }
  ],
  tags: ["phone", "apple", "flagship"]
})

Inserting Dates and Times

Current Time

db.events.insertOne({
  name: "User Registration",
  timestamp: new Date(),           // Current UTC time
  localTime: new Date().toLocaleString()
})

Specified Time

db.events.insertOne({
  name: "Meeting",
  startTime: new Date("2024-01-20T10:00:00Z"),
  endTime: ISODate("2024-01-20T12:00:00Z")
})

Inserting Binary Data

BinData

db.files.insertOne({
  filename: "document.pdf",
  contentType: "application/pdf",
  data: BinData(0, "base64encodedstring...")
})

Bulk Insert Best Practices

Batch Insert

// Batch insert for large amounts of data
var batchSize = 1000
var totalDocs = 10000

for (var i = 0; i < totalDocs; i += batchSize) {
  var batch = []
  for (var j = 0; j < batchSize && (i + j) < totalDocs; j++) {
    batch.push({
      index: i + j,
      data: "Sample data " + (i + j),
      createdAt: new Date()
    })
  }
  db.bulkdata.insertMany(batch)
  print("Inserted " + (i + batch.length) + " documents")
}

Error Handling

try {
  var result = db.users.insertMany([
    { name: "John" },
    { name: "Jane" },
    { _id: "existing_id", name: "Bob" }  // Potentially duplicate _id
  ], { ordered: false })
  
  print("Successfully inserted:", result.insertedIds.length)
} catch (e) {
  print("Insert error:", e)
  if (e.writeErrors) {
    e.writeErrors.forEach(function(err) {
      print("Error document index:", err.index)
      print("Error message:", err.errmsg)
    })
  }
}

Insert Validation

Check Insert Result

var result = db.users.insertOne({
  name: "John",
  age: 25
})

if (result.acknowledged) {
  print("Insert successful, ID:", result.insertedId)
} else {
  print("Insert failed")
}

Summary

Key points for inserting documents:

  • insertOne() for single document insertion
  • insertMany() for more efficient batch insertion
  • Auto-generates ObjectId when _id not specified
  • Use ordered: false for better batch insert fault tolerance
  • Large batches should be inserted in chunks

In the next chapter, we will learn about MongoDB Query Document.