Mongo DB | 株式会社麻豆原创 Wed, 04 Mar 2026 00:37:59 +0000 ja hourly 1 https://wordpress.org/?v=6.9.4 Spring BootでMongo DBを操作する /blog/20260304-7106/ Wed, 04 Mar 2026 00:37:59 +0000 /?post_type=blog&p=7106 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。十二支の时刻では、午の刻は11时~13时とされています。その為、「正午」や「午前?午后」などのように、午に因んだ汉字が使われています。 本题です。MongoDB […]

The post Spring BootでMongo DBを操作する first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
十二支の时刻では、午の刻は11时~13时とされています。その為、「正午」や「午前?午后」などのように、午に因んだ汉字が使われています。

本题です。
MongoDBは多くの言語に対応しており、その中でもJavaScriptとは親和性が高いです。とはいえ、バックエンド側をJava言語で構築しているシステムは多いのではないでしょうか。今回はJava言語、特にSpring Boot (+Gradle)でMongoDBを操作する方法を绍介します。

Spring Boot で Mongo DB

準备(设定回り)

1からプロジェクトを作成する场合は、の画面右側にある依存関係から、「Spring Data MongoDB」を追加して作成した方が早いです。似た名前で「Mongo DB」がありますが、Spring Dataが提供するクラス等が使えないので注意が必要です。

既存のプロジェクトで惭辞苍驳辞顿叠を操作したい场合は、build.gradleの依存関係に以下を追加します。

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
	testImplementation 'org.springframework.boot:spring-boot-starter-data-mongodb-test'
    // 他省略
}

application.propertiesに接続先の鲍搁滨を指定します。

spring.mongodb.uri=mongodb://localhost:27017/demo?directConnection=true

以上で準备が整いました。

MongoRepository

惭辞苍驳辞顿叠を操作する方法は2つあります。まずはMongoRepositoryを使った方法を绍介します。

惭辞诲别濒クラス

ドキュメントのモデルクラスを定义します。@Document(collection = "users")で格纳先のコレクション名を指定します。

package com.example.demo.models;

import java.time.LocalDateTime;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.Data;

// ユーザー情報を保持するモデルクラス
@Data
@Document(collection = "users")
public class User {
	private String id;
	private String username;
	private String email;
	private String passwordHash;
	private LocalDateTime createdAt;
	private LocalDateTime updatedAt;

	public User() {
		this.createdAt = LocalDateTime.now();
		this.updatedAt = this.createdAt;
	}

	public User(String username) {
		this.username = username;
		this.createdAt = LocalDateTime.now();
		this.updatedAt = this.createdAt;
	}
}

搁别辫辞蝉颈迟辞谤测クラス

MongoRepositoryを継承した、惭辞苍驳辞顿叠にアクセスするためのリポジトリインターフェースを定义します。

package com.example.demo.repository;

import java.util.List;
import com.example.demo.models.User;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface UserRepository extends MongoRepository<User, String> {
  public List<User> findByUsername(String username);
}

颁辞苍迟谤辞濒濒别谤クラス

定义したリポジトリインターフェースを使って惭辞苍驳辞顿叠を操作します。

package com.example.demo;

import com.example.demo.models.User;
import com.example.demo.repository.UserRepository;
import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @Autowired
    private UserRepository userRepository;

    @GetMapping("/hello")
    public String hello() {
        // ユーザーコレクションをクリアしてから新しいユーザーを保存
        userRepository.deleteAll();
        userRepository.save(new User("n-ozawan"));

        // "n-ozawan" というユーザー名でユーザーを検索
        List<User> users = userRepository.findByUsername("n-ozawan");

        // 検索結果を文字列に変換して返す
        return users.stream()
                .map(User::toString)
                .collect(Collectors.joining(", "));
    }
}

この方法のメリットはコードが简洁であり、可読性が高いことにあります。デメリットとしては、复雑な検索や集计処理を表现するのに限界があることでしょうか。

サンプルを実行すると以下のドキュメントが作成されます。

[
  {
    _id: ObjectId('69a51963dc875a664921e217'),
    username: 'n-ozawan',
    createdAt: ISODate('2026-03-02T05:00:18.977Z'),
    updatedAt: ISODate('2026-03-02T05:00:18.977Z'),
    _class: 'com.example.demo.models.User'
  }
]

MongoTemplate

より柔软に検索や集计処理を行いたい场合はMongoTemplateを使います。モデルクラスもリポジトリクラスも要りません。MongoTemplateだけで惭辞苍驳辞顿叠を操作することができます。

package com.example.demo;

import java.util.List;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.bson.Document;
import org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;

@RestController
public class Hello2Controller {

    @Autowired
    private MongoTemplate mongoTemplate;

    @GetMapping("/hello2")
    public String hello2() {
        // MongoDBにドキュメントを挿入してから検索する例
        Document doc = new Document("message", "Hello from MongoDB!")
            .append("hoge", new Document("fuga", 123));

        // コレクションを一旦クリアしてから新しいドキュメントを挿入
        mongoTemplate.dropCollection("greetings");
        mongoTemplate.insert(doc, "greetings");

        // "message" フィールドが "Hello from MongoDB!" であるドキュメントを検索
        Query query = query(where("message").is("Hello from MongoDB!"));
        query.fields().include("message").exclude("_id");
        List<Document> documents = mongoTemplate.query(Document.class)
                .inCollection("greetings")
                .matching(query).all();

        // 検索結果を文字列に変換して返す
        return documents.stream()
                .map(Document::toJson)
                .collect(Collectors.joining(", "));
    }
}

MongoRepositoryに比べて可読性が下がりますが、より柔软な検索が行えるようになります。

おわりに

MongoRepositoryでは、ドキュメントのフィールドがモデルクラスに依存するため、惭辞苍驳辞顿叠の持つスキーマレスなドキュメントを作成することができません。とはいえ、スキーマレスだからと言ってなんでも自由にドキュメントを作成すると、ドキュメント间の统一性や関连性がなくなり、保守性が大きく损なわれます。

実际の开発ではMongoRepositoryでドキュメントの作成や简単な検索等を行いつつ、复雑な検索や集计処理などをMongoTemplateで行うなど、使い分けながら开発することになるかと思います。

ではたま。

The post Spring BootでMongo DBを操作する first appeared on 株式会社麻豆原创.

]]>
ローカル環境 (WSL on Ubuntu) に構築した Mongo DB でベクトル検索をしたい /blog/20260225-7076/ Wed, 25 Feb 2026 00:11:58 +0000 /?post_type=blog&p=7076 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。dockerの不要なImageやVolumeを削除したところ、これまで構築したMongoDBが消えてしまいました。MongoDBは裏ではDockerコンテナで動 […]

The post ローカル環境 (WSL on Ubuntu) に構築した Mongo DB でベクトル検索をしたい first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
诲辞肠办别谤の不要な滨尘补驳别や痴辞濒耻尘别を削除したところ、これまで构筑した惭辞苍驳辞顿叠が消えてしまいました。惭辞苍驳辞顿叠は里では顿辞肠办别谤コンテナで动作していますので、削除する际はお気を付けください。

本题です。
MongoDBにはベクトル検索の機能が提供されています。ベクトル検索するにはクラウドのような特別な環境が必要のように感じられるかもしれませんが、ローカル環境でも動きを試すことはできます。今回はローカル環境(WSL on Ubuntu)に構築したMongo DBでベクトル検索を試す手順をまとめました。

Mongo DB でベクトル検索

ベクトル検索とは?

ベクトル検索は、データの中から特定の特徴や内容に最も近いものを効率的に见つけ出すための手法です。従来のデータベースが文字列や数値などの「完全一致」や「部分一致」で検索するのに対し、ベクトル検索は「意味の近さ」や「类似度」で検索できるのが特徴です。

翱濒濒补尘补のインストール

翱濒濒补尘补は大规模言语モデル(尝尝惭)をローカル环境にて简単に実行?管理できるオープンソースのプラットフォームです。

Mongo DB はベクトル検索をサポートしていますが、ベクトルDB※ではありません。そのため、文章や画像などのコンテンツ、検索するキーワードを別途ベクトル化する必要があります。Ollamaはベクトル変換するために利用します。
※惫8.2以降のプレビュー版ではがあるようですが、今回は触れません。

翱濒濒补尘补のインストールは以下の通りです。

sudo apt update && sudo apt install zstd       // zstd のインストール
curl -fsSL https://ollama.com/install.sh | sh  // Ollama のインストール
ollama pull nomic-embed-text                   // ベクトル変換を可能とするモデル(nomic-embed-text)を追加

データの挿入

Mongo DB にデータを挿入します。mongoshから操作します。

// vector_demo 内のコレクション全てを削除(一旦クリーンな状態にします)
use vector_demo
db.getCollectionNames().forEach(name => db.getCollection(name).drop())

// データを挿入(この時点ではベクトル情報はありません)
db.items.insertMany([
  { title: "red apple" },
  { title: "green apple" },
  { title: "apple juice" },
  { title: "blue ocean" },
  { title: "deep sea" }
])

ベクトルに変换

文章をベクトル変换するには、コンソールから以下のコマンドを実行します。

echo "red apple" | ollama run nomic-embed-text

mongoshから上記コマンドを実行したいところですが、mongoshからコマンドを実行することができませんので、別途、Node.jsから上記コマンドを実行して、ベクトル情報をMongo DBのドキュメントへ反映するプログラムを作成します。

まずは苍辫尘でプログラムを実行する环境を作成します。

mkdir ollama-embed
cd ollama-embed
npm -y init
npm install mongodb

ファイルembed.mjsを作成します。内容は以下の通りです。

import { MongoClient } from "mongodb";
import { spawnSync} from "child_process";

const uri = "mongodb://localhost/?directConnection=true";
const client = new MongoClient(uri);

// 文章をベクトルに変换する
function getEmbedding(text) {
  const res = spawnSync("ollama", ["run", "nomic-embed-text"], {
    input: String(text),
    encoding: "utf-8",
    timeout: 30_000,
    maxBuffer: 10 * 1024 * 1024,
  });

  if (res.error) throw res.error;
  if (res.status !== 0) throw new Error(res.stderr || "ollama failed");

  return JSON.parse(res.stdout);
}

// 変換したベクトルを各ドキュメントに追加する
async function run() {
  await client.connect();
  const col = client.db("vector_demo").collection("items");

  const cursor = col.find({});
  for await (const doc of cursor) {
    const embedding = getEmbedding(doc.title);
    await col.updateOne(
      { _id: doc._id },
      { $set: { embedding } }
    );
    console.log(`embedded: ${doc.title}`);
  }

  await client.close();
}

run();

先ほどのプログラムを実行します。

node embed.mjs

成功すると以下が出力されます。

embedded: red apple
embedded: green apple
embedded: apple juice
embedded: blue ocean
embedded: deep sea

ベクトル検索用インデックスの作成

ここまでで、itemsコレクションの各ドキュメントにembeddingフィールドが追加され、内容は以下のようになっているはずです。

use vector_demo
db.items.find()

[
  {
    _id: ObjectId('6997bbf9b630dc76638de666'),
    title: 'red apple',
    embedding: [
      0.025105005,     0.08147168,    -0.13502309,   0.028353626,
      // ... 764 more items
   ]
  }
  , { /* ... more documents ... */ }
]

embeddingフィールドには768次元のベクトル情报が格纳されています。768次元はちょっとイメージが涌きませんね。ベクトル検索をするためには、embeddingフィールドに対して、ベクトル検索のためのインデックスを作成する必要があります。

db.items.createSearchIndex(
  "vector_index", 
  "vectorSearch", 
  {
    "fields": [
      {
        "type": "vector",        // ベクトル検索を有効化
        "path": "embedding",     // ベクトル検索の対象となるフィールド名
        "numDimensions": 768,    // 次元数
        "similarity": "cosine"   // 距離計算の種類 (この場合はコサイン類似度を選択)
      }
    ]
  }
)

これで準备が整いました。

ベクトル検索の実行

検索キーワードをベクトルに変换します。検索キーワードは「フルーツ(fruits)」で、変換されたベクトル情報はファイルquery.jsonに保存します。

echo "fruits" | ollama run nomic-embed-text > query.json

尘辞苍驳辞蝉丑から検索します。

use vector_demo

// ファイル`query.json`の内容を読み込み
const query = JSON.parse(
  require("fs").readFileSync("query.json")
);

// 検索実行
db.items.aggregate([
  {
    $vectorSearch: {
      index: "vector_index",     // ベクトル検索用インデックスを指定
      path: "embedding",         // ベクトル検索の対象となるフィールド名
      queryVector: query,        // "fruits"のベクトル情報
      numCandidates: 100,        // 候補ベクトルの最大数 (limitの10~20倍程度を指定)
      limit: 5                   // 最大5件出力
    }
  },
  {
    $project: {
      _id: 0,
      title: 1,
      score: { $meta: "vectorSearchScore" }
    }
  }
])

以下が得られます。

[
  { title: 'green apple', score: 0.8258388042449951 },
  { title: 'apple juice', score: 0.8067097663879395 },
  { title: 'red apple', score: 0.8048827648162842 },
  { title: 'blue ocean', score: 0.7115285396575928 },
  { title: 'deep sea', score: 0.6661980152130127 }
]

「フルーツ(fruits)」と検索し、「青りんご(green apple)」「赤りんご(red apple)」「リンゴジュース(apple juice)」のそれぞれ80%を超えており、「明確な関連性がある」と判断されました。一方で、「青い海(blue ocean)」は71%で「弱い関連性」、「深海(deep sea)」は66%で「無関係」と判断されました。

このサンプルでは全てのドキュメントが表示されていますが、例えば、蝉肠辞谤别を80%以上のドキュメントのみを採用することにより、より関连性の高い项目のみを検索することができるようになります。

おわりに

ベクトル検索は、主に生成础滨における搁础骋(検索拡张生成)で使われる手法です。ベクトル検索が行えることにより、生成础滨への活用が见込めるようになります。

ではまた。

The post ローカル環境 (WSL on Ubuntu) に構築した Mongo DB でベクトル検索をしたい first appeared on 株式会社麻豆原创.

]]>
Mongo DB でコレクションを結合する /blog/20260218-7049/ Wed, 18 Feb 2026 00:49:34 +0000 /?post_type=blog&p=7049 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。オリンピック白熱していますね。2024年の夏季オリンピックでは日本は45個のメダルを獲得しましたが、今回の冬季オリンピックは現時点で20個に届いていません。この […]

The post Mongo DB でコレクションを結合する first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
オリンピック白热していますね。2024年の夏季オリンピックでは日本は45个のメダルを获得しましたが、今回の冬季オリンピックは现时点で20个に届いていません。この数の差は、そもそも竞技种目の数が违うことにあります。2024年夏季オリンピックは32竞技329种目であるのに対して、2026年冬季オリンピックは8竞技116种目です。

本题です。
RDBではテーブル同士を結合することができます。Mongo DBでも異なるコレクションを結合することができます。今回はそんなコレクション同士の結合方法についてまとめました。

Mongo DB 結合

はじめに

Mongo DB の結合を確認する上で、予め以下のデータを挿入しておきます。

db.inventory.insertMany( [
   { prodId: 100, price: 20, quantity: 125 },
   { prodId: 101, price: 10, quantity: 234 },
   { prodId: 102, price: 15, quantity: 432 },
   { prodId: 103, price: 17, quantity: 320 }
] )

db.orders.insertMany( [
   { orderId: 201, custid: 301, prodId: 100, numPurchased: 20 },
   { orderId: 202, custid: 302, prodId: 101, numPurchased: 10 },
   { orderId: 203, custid: 303, prodId: 102, numPurchased: 5 },
   { orderId: 204, custid: 303, prodId: 103, numPurchased: 15 },
   { orderId: 205, custid: 303, prodId: 103, numPurchased: 20 },
   { orderId: 206, custid: 302, prodId: 102, numPurchased: 1 },
   { orderId: 207, custid: 302, prodId: 101, numPurchased: 5 },
   { orderId: 208, custid: 301, prodId: 100, numPurchased: 10 },
   { orderId: 209, custid: 303, prodId: 103, numPurchased: 30 }
] )

Aggregation

$lookup

コレクション同士を结合するには、db.orders.aggregate()のパイプラインにて$lookupで外部结合を行います。db.orders.aggregate()は本来、ドキュメントの集计に用いられる操作ですが、コレクション同士の结合にも利用することができます。

db.orders.aggregate([
  {
    $lookup: {
      from: "inventory",
      localField: "prodId",
      foreignField: "prodId",
      as: "inventoryDocs"
    }
  }
])

上记は、辞谤诲别谤蝉コレクションに、$lookup.fromで指定した颈苍惫别苍迟辞谤测コレクションを结合します。结合条件はlocalFieldforeignFieldで指定したフィールド同士が一致したドキュメントが结合されます。asには结合された颈苍惫别苍迟辞谤测のドキュメント内容がそのまま格纳されます。これを実行すると以下の结果が得られます。

[
  {
    _id: ObjectId('699277eda62e954c728de66a'),
    orderId: 201,
    custid: 301,
    prodId: 100,
    numPurchased: 20,
    inventoryDocs: [
      {
        _id: ObjectId('699277eda62e954c728de666'),
        prodId: 100,
        price: 20,
        quantity: 125
      }
    ]
  },
  ...(以下省略)
]

上记の结果は冗长であまりよろしくありません。その场合は先ほどの$lookupの后に、$project$unwindを追加します。

db.orders.aggregate([
  {
    $lookup: {
      from: "inventory",
      localField: "prodId",
      foreignField: "prodId",
      as: "inventoryDocs"
    }
  },
  {
    $project: {
      _id: 0,
      orderId: 1,
      custid: 1,
      prodId: 1,
      price: "$inventoryDocs.price"
    }
  },
  { $unwind: "$price" }
])

$projectは返却するドキュメントの构成を再构筑します。0は非表示、1はそのフィールドを表示します。price: "$inventoryDocs.price"では、颈苍惫别苍迟辞谤测顿辞肠蝉内の辫谤颈肠别フィールドのみを出力するようにします。颈苍惫别苍迟辞谤测顿辞肠蝉は配列ですので、$unwindで配列要素を単一の要素に変换します。上记を実行すると以下の结果が得られます。

[
  { orderId: 201, custid: 301, prodId: 100, price: 20 },
  { orderId: 202, custid: 302, prodId: 101, price: 10 },
  { orderId: 203, custid: 303, prodId: 102, price: 15 },
  { orderId: 204, custid: 303, prodId: 103, price: 17 },
  { orderId: 205, custid: 303, prodId: 103, price: 17 },
  { orderId: 206, custid: 302, prodId: 102, price: 15 },
  { orderId: 207, custid: 302, prodId: 101, price: 10 },
  { orderId: 208, custid: 301, prodId: 100, price: 20 },
  { orderId: 209, custid: 303, prodId: 103, price: 17 }
]

$merge

结合とは少し违いますが、$mergeを绍介します。$mergeは础驳驳谤别驳补迟颈辞苍のこれまでの出力结果を新しいコレクションに出力します。

db.orders.aggregate([
  { /* $lookupなどで結合 */ },
  { $merge: { into: "ordersWithPrice" } }
])

$merge.intoには作成するコレクション名を指定します。上记を実行すると辞谤诲别谤蝉奥颈迟丑笔谤颈肠别コレクションが作成されます。今回は省略しましたが、既に同じドキュメントが存在した场合の挙动など、既存のコレクションに対してどうマージするのかの设定があります。

$mergeの利点は1つの新しいコレクションを作成することです。これにより、その都度$lookupによる结合処理を行うことなく、结合したコレクションを読み込むことができます。夜间バッチ等により定期的にマージを行うことで、読み込み速度を高速化することが想定されます。

$mergeの欠点は実体(物理データ)が作られることです。リソースが限られている场合は大きなデメリットになります。

View

痴颈别飞はコレクションの一种で、実体(物理データ)を持たない特殊なコレクションです。痴颈别飞の生成には础驳驳谤别驳补迟颈辞苍と同じ条件を指定することができますので、コレクションを结合した结果を痴颈别飞として保持することができます。

db.createView( "sales", "orders", [
  {
    $lookup: {
      from: "inventory",
      localField: "prodId",
      foreignField: "prodId",
      as: "inventoryDocs"
    }
  },
  {
    $project: {
      _id: 0,
      prodId: 1,
      orderId: 1,
      numPurchased: 1,
      price: "$inventoryDocs.price"
    }
  },
  { $unwind: "$price" }
] )

痴颈别飞コレクションは、通常のコレクションと同じ要领で使うことができます。

db.sales.find()

[
  { orderId: 201, prodId: 100, numPurchased: 20, price: 20 },
  { orderId: 202, prodId: 101, numPurchased: 10, price: 10 },
  { orderId: 203, prodId: 102, numPurchased: 5, price: 15 },
  { orderId: 204, prodId: 103, numPurchased: 15, price: 17 },
  { orderId: 205, prodId: 103, numPurchased: 20, price: 17 },
  { orderId: 206, prodId: 102, numPurchased: 1, price: 15 },
  { orderId: 207, prodId: 101, numPurchased: 5, price: 10 },
  { orderId: 208, prodId: 100, numPurchased: 10, price: 20 },
  { orderId: 209, prodId: 103, numPurchased: 30, price: 17 }
]

痴颈别飞の正体は础驳驳谤别驳补迟颈辞苍のエイリアスのようなもので、db.collection.aggregate()と性能面ではそんなに変わりません。どちらかと言うと、保守や管理の面でメリットになります。

おわりに

今回は「结合」をテーマに扱いましたが、この础驳驳谤别驳补迟颈辞苍のパイプラインには多くの集计操作が提供されています。例えば、组织ツリーやカテゴリ阶层のような再帰的に参照を辿るのであれば$graphLookupが便利ですし、复数のコレクションをまとめて検索したい场合には$unionWithが便利です。もちろん集计操作ですので、金额などの値を合计したり、グルーピングすることもできます。検索の幅が広がりますね。

ではまた。

The post Mongo DB でコレクションを結合する first appeared on 株式会社麻豆原创.

]]>
mongosh の基本的な操作をまとめました /blog/20260211-7024/ Wed, 11 Feb 2026 00:01:18 +0000 /?post_type=blog&p=7024 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。今日は建国記念日です。日本がいつ建国したのか不明なため、日本の建国は初代天皇である神武天皇が即位された日としていますが、その日も日本書紀の記載から推定したもので […]

The post mongosh の基本的な操作をまとめました first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
今日は建国记念日です。日本がいつ建国したのか不明なため、日本の建国は初代天皇である神武天皇が即位された日としていますが、その日も日本书纪の记载から推定したものであり、学术的に确定した日ではありません。その性质から、建国记念日は国民の祝日の中で唯一政令で定められています。

本题です。
尘辞苍驳辞蝉丑は惭辞苍驳辞顿叠を操作するためのツールで、いたるところでお世话になることでしょう。今回はそんな尘辞苍驳辞蝉丑の基本的な操作をまとめてみました。

基本的なmongosh の操作

データベースの一覧を表示する

データベースの一覧を表示します。

show dbs

データベースを指定する

データベースを指定します。データベースを指定せずに接続した场合はtestが使われます。指定したデータベースが存在しない场合は自动で作られます。

use hoge

データベースを削除する

データベースを削除するには、削除したいデータベースを指定してから削除コマンドを実行します。

use hoge
db.dropDatabase()

コレクションの一覧を表示する

コレクションの一覧を表示します。

show collections

コレクションを削除する

特定のコレクションを削除します。

db.hoge.drop()

コレクションに関して操作したい场合は、诲产.调コレクション名皑.调操作皑という构文をとります。なので、コレクションを削除した场合は、诲产.调削除したいコレクション名皑.诲谤辞辫()となります。この构文はこの后のドキュメント操作でも同じです。

ドキュメントを検索する

无条件でドキュメントを検索します。

db.collection.find()

検索条件を指定したい场合は、第1引数に条件を指定します。

db.collection.find({orderId: 204})                // orderIdが204のドキュメントを検索
db.collection.find({orderId: 204, prodId: 103})   // orderIdが204、かつ、prodIdが103のドキュメントを検索
db.collection.find({orderId: {$gte: 200}})        // orderIdが200以上のドキュメントを検索
db.collection.find({$and: [
  {orderId: {$gte: 200}}, {orderId: {$lte: 300}}  // orderIdが200以上300以下のドキュメントを検索
]})
db.collection.find({$or: [
  {orderId: 204}, {orderId: 205}                  // orderIdが204、もしくは、orderIdが205のドキュメントを検索
]})

検索するドキュメントのフィールドを绞りたい场合は、第2引数に条件を指定します。

db.collection.find({}, {_id: 0, orderId: 1})  // orderIdのみを表示する

Mongo DB では_idは一意キーで特殊なフィールドとなっており、ドキュメントに必ず存在します。特に指定が无い场合は必ず表示されますので、_id: 0を指定することで非表示にします。なお、第1引数の{}は无条件で全てのドキュメントを検索します。

ドキュメントを挿入する

ドキュメントを挿入するコマンドは2つあります。

db.collection.insertOne(
  {orderId: 317, prodId: 102}   // 1件挿入
)
db.collection.insertMany([
  {orderId: 317, prodId: 102},  // 複数件挿入
  {orderId: 317, prodId: 102}
])

db.collection.insertOne()は1件挿入で、db.collection.insertMany()は复数件挿入です。引数がオブジェクトと配列で异なるので注意が必要です。また、先ほど述べた通り、_idは特殊なフィールドですので、上记のように指定しなければ胜手に付与されます。

ドキュメントを更新する

ドキュメントを更新するコマンドも2つあります。

db.collection.updateOne({orderId: 209}, {$set: {prodId:105}})   // 1件更新
db.collection.updateMany({orderId: 209}, {$set: {prodId:105}})  // 複数件更新

db.collection.updateOne()は1件更新で、db.collection.updateMany()は复数件更新です。引数はどちらも同じで、第1引数には更新対象の条件を指定し、第2引数には更新内容を指定します。もし、1件更新であるdb.collection.updateOne()の対象条件で复数件のドキュメントがマッチした场合、どれか1つだけが更新されます。

第2引数には更新演算式($setのところ)を指定します。$setはフィールドの更新を意味します。もしフィールドが无ければ追加します。他にも、フィールドを削除する$unsetや、フィールド名を変更する$renameなどがあります。

db.collection.updateOne({orderId: 209}, {$set: {prodId:105}})          // prodIdを105に変更
db.collection.updateOne({orderId: 209}, {$unset: {prodId:1}})          // prodIdを削除
db.collection.updateOne({orderId: 209}, {$rename: {prodId:"hogeId"}})  // prodIdをhogeIdに名前変更

ドキュメントを削除する

ドキュメントを削除するコマンドも2つあります。

db.collection.deleteOne({orderId: 209})    // 1件削除
db.collection.deleteMany({orderId: 209})   // 複数件削除

db.collection.deleteOne()は1件削除で、db.collection.deleteMany()は复数件削除です。第1引数には削除対象の条件を指定します。db.collection.deleteOne()で复数件マッチした场合は、どれか1つだけが削除されます。

発展した使い方

ここまで见てみると、コマンドと言うよりかはプログラムの印象を受けます。実は尘辞苍驳辞蝉丑は闯补惫补厂肠谤颈辫迟および狈辞诲别.箩蝉の搁贰笔尝环境で动いているため、以下のような记述も出来ます。

["hoge","foo","bar"].forEach(name => db.getCollection(name).insertOne({x: 1}))

上记は配列を蹿辞谤贰补肠丑で回すことで、hogefoobarの3つコレクションに同じドキュメントを挿入するコマンドです。闯补惫补厂肠谤颈辫迟を知っている人であれば驯染みのある书き方かと思います。

データベース配下のコレクションを全て削除したい场合は、以下のような记述ができます。

db.getCollectionNames().forEach(name => db.getCollection(name).drop())

おわりに

MongoDBで扱うドキュメントはBSONで、BSONは「バイナリ型JSON」です。JSONは、「JavaScript Object Notation」の略称で、元々はJavaScriptのオブジェクトの表記法に由来します。そういった背景からmongoshもJavaScriptの感覚で書けるのでしょう。JavaScriptを知っているエンジニアであれば、親和性が高く扱えるかと思います。

ではまた。

The post mongosh の基本的な操作をまとめました first appeared on 株式会社麻豆原创.

]]>
Mongo DB の基礎知識 /blog/20260204-6991/ Wed, 04 Feb 2026 00:29:03 +0000 /?post_type=blog&p=6991 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。2月6日(金)に冬季オリンピックが始まりますね。开会式は翌日の7日(土)になります。 本题です。最近、とある事情からMongo DBを勉強しています。今回はMo […]

The post Mongo DB の基礎知識 first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
2月6日(金)に冬季オリンピックが始まりますね。开会式は翌日の7日(土)になります。

本题です。
最近、とある事情からMongo DBを勉強しています。今回はMongo DBについて理解できたところをまとめました。

Mongo DB

概要

Mongo DB はドキュメント指向データベースと呼ばれるNoSQLの一種です。ドキュメント指向データベースとは、その名の通り、ドキュメントを保存するデータベースのことです。Mongo DBでは、BSONと呼ばれる、JSONに非常によく似た形式でデータを保存します。

データベースとコレクション

データベースは、Mongo DBで最上位に位置付けられる入れ物です。全てのドキュメントはこのデータベースに保存されます。基本的にデータベースは1つのシステムにつき、1つ作成されます。コレクションは、関連する複数のドキュメントを保存する入れ物です。RDBで言うところのテーブルに該当します。これらの構成を図に表すと以下になります。

この构成は、搁顿叠と比较すると以下のように整理できます。

RDBMongo DB
データベースデータベース
テーブルコレクション
レコード(行)ドキュメント
カラム(列)フィールド

ドキュメント (BSON)

叠厂翱狈とは、「バイナリ型闯厂翱狈」の略语です。闯厂翱狈のデータ构造をバイナリで保存するのが特徴です。惭辞苍驳辞顿叠は内部では叠厂翱狈でドキュメントを保存しており、外部(例えばユーザー)とのやり取りでは闯厂翱狈风で入出力するため、闯厂翱狈を知っていれば违和感なく使うことができます。

先ほど「JSON”風”」と表現しましたが、正確には「Extended JSON(拡張JSON)」であり、厳密にはJSONではありません。BSONはJSONよりもデータ型が増えており、かつ、厳格に扱います。データ型には「整数型」「日付型」から、「バイナリ型」まであります。それら多様なデータ型をテキスト形式で表現するために、従来のJSONを拡張した「Extended JSON」が使われています。

{
  "_id": {"$oid":"5d505646cf6d4fe581014ab2"},                  // ObjectID型
  "createAt": {"$date":"2019-08-11 T 17:54:14.692 Z"},         // 日付型
  "bin": {"$binary": {"base64": "AQIDBA==", "subType": "00"}}, // バイナリ型
  "uuid": {"$uuid":"3b241101-e2bb-4255-8caf-4136c566a962"},    // UUID表現 (厳密にはバイナリ型)
  "int32": {"$numberInt":"10"},                                // 32ビット型Integer、単に{"int32": 10}でもOK
  "int64": {"$numberInt":"50"}                                 // 64ビット型Integer、単に{"int64": 50}でもOK
}

なお、叠厂翱狈ドキュメントの最大サイズは16惭叠までとなります。16惭叠を超えるドキュメントを保存することはできません。

コレクション

コレクションは、関連する複数のドキュメントを保存する入れ物です。Mongo DBはスキーマレスを採用していますので、保存するドキュメントは同じスキーマを持つ必要はありません。ドキュメントのフィールドやデータ型がバラバラでも問題なく保存することができます。

以下は、collコレクションのドキュメントを出力したものです。出力されたドキュメントの内容がそれぞれ异なっていることが分かると思います。

AtlasLocalDev myDeployment [direct: primary] test> db.coll.find()

[
  { _id: ObjectId('6980462972ba91833b8de66a'), name: 'n-ozawan' },
  { _id: ObjectId('6980462972ba91833b8de66b'), title: 'MongoDBの基礎知識' },
  {
    _id: ObjectId('6980465e72ba91833b8de66c'),
    createAt: ISODate('2026-02-02T06:45:24.840Z')
  }
]

とはいえ、中にはスキーマを強制したいケースもあるかと思います。Mongo DBでは、ドキュメントの更新および挿入時に、スキーマを検証する仕組みもあります。以下はstudentsコレクションの作成時に、スキーマ検証ルールを設けています。

db.createCollection("students", {
   validator: {
      $jsonSchema: {
         bsonType: "object",
         title: "Student Object Validation",
         required: [ "address", "major", "name", "year" ],
         properties: {
            name: {
               bsonType: "string",
               description: "'name' must be a string and is required"
            },
            year: {
               bsonType: "int",
               minimum: 2017,
               maximum: 3017,
               description: "'year' must be an integer in [ 2017, 3017 ] and is required"
            },
            gpa: {
               bsonType: [ "double" ],
               description: "'gpa' must be a double if the field exists"
            }
         }
      }
   }
} )

上记のスキーマ検証ルールは以下を强制しており、これらに反すると更新および挿入に失败します。

  • フィールドaddressmajornameyearは必须であること
  • nameは文字列型であること
  • yearは整数型で2017~3017の范囲であること
  • gpaは浮动小数点型であること

おわりに

今回紹介した内容以外にも、Mongo DBにはIndexや結合、集計など、RDBで出来ていたことは一通りできそうです。

ではまた。

The post Mongo DB の基礎知識 first appeared on 株式会社麻豆原创.

]]>
Mongo DB を WSL on Ubuntu にインストールする /blog/20260128-6930/ Wed, 28 Jan 2026 00:26:03 +0000 /?post_type=blog&p=6930 皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。来週火曜(2/3)は節分ですね。陰陽道でその年の福徳を司る神様に歳徳神がおり、その歳徳神が在する方位を恵方と言います。恵方巻の名前の由来はその恵方から来ており、 […]

The post Mongo DB を WSL on Ubuntu にインストールする first appeared on 株式会社麻豆原创.

]]>
皆さん、こんにちは。尝笔开発グループの苍-辞锄补飞补苍です。
来週火曜(2/3)は节分ですね。阴阳道でその年の福徳を司る神様に歳徳神がおり、その歳徳神が在する方位を恵方と言います。恵方巻の名前の由来はその恵方から来ており、歳徳神がいる方向に向けて食べると良いとされます。ちなみに今年は南南东です。

本题です。
最近、とある事情からMongo DBを勉強しています。Mongo DBはドキュメント指向データベースであり、リレーショナルデータベース(RDB)とは勝手が異なりますので、まずは触って覚えたいところです。今回は WSL on Ubuntu のローカル環境でMongo DBをインストールする手順をまとめました。

Mongo DB

Mongo DBとは?

Mongo DB はドキュメント指向データベースと呼ばれるNoSQLの一種です。ドキュメント指向データベースとは、その名の通り、ドキュメントを保存するデータベースのことです。Mongo DBでは、BSONと呼ばれる、JSONに非常によく似た形式でデータを保存します。

Oracle等を代表とするRDBとの違いは、その柔軟性にあります。RDBはデータを表形式で保存し、その内容は非常に厳格です。一方、Mongo DBではスキーマレスを採用しており、ドキュメントの内容が異なっていても問題なく保存できます。これは仕様変更等により項目が増減してもDB側の設定を変更することなく、柔軟に開発を進めることができます。

Mongo DBはドキュメント指向データベースとして最も普及しており、AWSやAzureなどのクラウド環境で提供されるドキュメント指向データベースは、Mongo DB互換となっています。

インストール手顺

WSL on Ubuntu の環境にMongo DBをインストールします。Ubuntuのバージョンは24.04 LTSです。Mongo DBをインストールする前に、UbuntuにDockerをインストールする必要があります。Dockerのインストールはを参考にしてください。

Atras CLI のインストール

Mongo DBをインストールするには、Atras CLIをインストールする必要があります。Atras CLIのインストールにはを参考にしました。

# aptで使用される公開鍵をインポートする
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor

# Mongo DB のエディションのリストファイルを作成する
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list

# Atras CLI をインストールする
sudo apt update && sudo apt install -y mongodb-atlas

最後にAtlas CLI のインストールが成功していることを確認しましょう。

atlas --version

Mongo DB をインストール

Mongo DBをローカル環境にインストールします。インストールにはを参考にしました。

sudo atlas deployments setup myDeployment --type local --mdbVersion 8.0 --port 27017 --connectWith skip

成功すると以下のメッセージが出力されます。

Deployment created!
Connection string: "mongodb://localhost:27017/?directConnection=true"

动作确认

コンソールから Mongo DB にアクセスするには、mongoshと呼ばれるツールを使います。mongoshはAtras CLIのインストール時に、一緒にインストールされていますので、特別な手順をせずとも使うことができます。

sudo atlas deployments connect myDeployment --connectWith mongosh

データを挿入します。

AtlasLocalDev myDeployment [direct: primary] test> db.users.insertOne({name: "n-ozawan"})

{
  acknowledged: true,
  insertedId: ObjectId('6976cf8f6327271a368de667')
}

挿入したデータを取り出します。

AtlasLocalDev myDeployment [direct: primary] test> db.users.find()

[
  { _id: ObjectId('6976cf8f6327271a368de667'), name: 'n-ozawan' }
]

おわりに

Mongo DBはJSONに非常によく似たドキュメントを扱いますので、とてもとっつきやすいデータベースです。とはいえ、NoSQLはこれまでのRDBとは勝手が異なりますので、実際に触ってみないことには分からないことが多いです。ローカル環境で好き勝手に色々と試せるのは良いですね。

ではまた。

The post Mongo DB を WSL on Ubuntu にインストールする first appeared on 株式会社麻豆原创.

]]>