# Notsql - JSONベースの簡易NoSQL DB
**Notsql**は、JSONファイルベースの簡易NoSQL データベースライブラリです。MongoDBライクな構文を提供し、インストール不要で小規模なサービスやクライアントアプリケーションに最適です。
## 🚀 特徴
- **📁 ファイルベース**: JSONファイルによるデータ保存
- **🔍 Mongoライクな構文**: 使い慣れたMongoDBのクエリ構文
- **⚡ インストール不要**: 外部依存なし
- **🔐 同時アクセス対応**: ファイルロック機能
- **📊 インデックス機能**: 高速検索のためのインデックス
- **🎯 小規模サービス向け**: 軽量で簡単に導入可能
## 📦 インストール
```bash
pip install notsql
```
## 🎯 基本的な使い方
### データベース接続
```python
from notsql import NotsqlDB
# データベースを作成・接続
db = NotsqlDB('myapp')
# 特定のパスを指定
db = NotsqlDB('myapp', db_path='/path/to/data')
```
### コレクション操作
```python
# コレクションを取得
users = db.collection('users')
```
### 挿入操作
```python
# 単一ドキュメントの挿入
user_id = users.insert_one({
'name': 'Alice',
'age': 30,
'email': 'alice@example.com'
})
# 複数ドキュメントの挿入
user_ids = users.insert_many([
{'name': 'Bob', 'age': 25},
{'name': 'Charlie', 'age': 35}
])
```
### 検索操作
```python
# 単一ドキュメントの検索
user = users.find_one({'name': 'Alice'})
# 全ドキュメントの検索
all_users = users.find()
# 条件付き検索
adults = users.find({'age': {'$gte': 18}})
# 制限とスキップ
recent_users = users.find({}, limit=10, skip=5)
# ソート
sorted_users = users.find({}, sort={'age': -1}) # 降順
```
### 更新操作
```python
# 単一ドキュメントの更新
users.update_one(
{'name': 'Alice'},
{'$set': {'age': 31}}
)
# 複数ドキュメントの更新
users.update_many(
{'age': {'$lt': 18}},
{'$set': {'category': 'minor'}}
)
```
### 削除操作
```python
# 単一ドキュメントの削除
users.delete_one({'name': 'Alice'})
# 複数ドキュメントの削除
users.delete_many({'age': {'$lt': 18}})
```
## 🔍 クエリオペレーター
### 比較オペレーター
```python
# 等価
users.find({'age': 30})
users.find({'age': {'$eq': 30}})
# 不等価
users.find({'age': {'$ne': 30}})
# 大なり・小なり
users.find({'age': {'$gt': 25}}) # >
users.find({'age': {'$gte': 25}}) # >=
users.find({'age': {'$lt': 35}}) # <
users.find({'age': {'$lte': 35}}) # <=
# 範囲
users.find({'age': {'$in': [25, 30, 35]}})
users.find({'age': {'$nin': [25, 30, 35]}})
```
### 論理オペレーター
```python
# AND
users.find({'$and': [
{'age': {'$gte': 25}},
{'age': {'$lte': 35}}
]})
# OR
users.find({'$or': [
{'age': {'$lt': 25}},
{'age': {'$gt': 35}}
]})
# NOT
users.find({'$not': {'age': {'$gte': 18}}})
```
### 配列オペレーター
```python
# 配列内の要素を検索
users.find({'tags': {'$in': ['python', 'javascript']}})
# 配列のサイズ
users.find({'tags': {'$size': 3}})
# 配列の全要素がマッチ
users.find({'tags': {'$all': ['python', 'programming']}})
# 配列内のオブジェクトマッチ
users.find({'scores': {'$elemMatch': {'subject': 'math', 'score': {'$gte': 80}}}})
```
### 文字列オペレーター
```python
# 正規表現
users.find({'name': {'$regex': r'^A.*'}})
# 大文字小文字を無視
users.find({'name': {'$regex': r'^alice', '$options': 'i'}})
```
### 存在チェック
```python
# フィールドの存在
users.find({'email': {'$exists': True}})
# 型チェック
users.find({'age': {'$type': 'int'}})
```
## 🎯 更新オペレーター
```python
# 値の設定
users.update_one({'name': 'Alice'}, {'$set': {'age': 31}})
# 値の削除
users.update_one({'name': 'Alice'}, {'$unset': {'age': 1}})
# 数値の増減
users.update_one({'name': 'Alice'}, {'$inc': {'age': 1}})
# 配列への追加
users.update_one({'name': 'Alice'}, {'$push': {'tags': 'new_tag'}})
# 配列から削除
users.update_one({'name': 'Alice'}, {'$pull': {'tags': 'old_tag'}})
# 配列への重複なし追加
users.update_one({'name': 'Alice'}, {'$addToSet': {'tags': 'unique_tag'}})
```
## 📊 インデックス機能
```python
# インデックスの作成
users.create_index('email')
# ユニークインデックス
users.create_index('email', unique=True)
# インデックスの削除
users.drop_index('email')
# インデックス一覧
indexes = users.list_indexes()
```
## 🗂️ データベース管理
```python
# コレクション一覧
collections = db.list_collections()
# コレクションの削除
db.drop_collection('users')
# データベースの削除
db.drop_database()
# 統計情報
stats = db.get_stats()
```
## 🎨 実用例
### ブログシステム
```python
from notsql import NotsqlDB
# データベース接続
db = NotsqlDB('blog')
# コレクション作成
users = db.collection('users')
posts = db.collection('posts')
comments = db.collection('comments')
# インデックス作成
users.create_index('email', unique=True)
posts.create_index('author_id')
comments.create_index('post_id')
# ユーザー作成
user_id = users.insert_one({
'name': 'Alice',
'email': 'alice@example.com',
'role': 'author'
})
# 投稿作成
post_id = posts.insert_one({
'title': 'Python入門',
'content': 'Pythonの基本的な使い方について',
'author_id': user_id,
'tags': ['python', 'programming'],
'status': 'published'
})
# コメント作成
comments.insert_one({
'post_id': post_id,
'author_id': user_id,
'content': 'とても参考になりました!'
})
# 検索
published_posts = posts.find({'status': 'published'})
python_posts = posts.find({'tags': {'$in': ['python']}})
```
### ECサイト
```python
# 商品管理
products = db.collection('products')
orders = db.collection('orders')
# 商品データ
products.insert_many([
{
'name': 'ノートPC',
'category': 'electronics',
'price': 80000,
'stock': 10
},
{
'name': 'マウス',
'category': 'electronics',
'price': 2000,
'stock': 50
}
])
# 価格帯での検索
affordable_products = products.find({'price': {'$lte': 50000}})
# 在庫のある商品
in_stock = products.find({'stock': {'$gt': 0}})
```
## 🔧 設定とパフォーマンス
### データベースパス
```python
# デフォルト: ./data/database_name/
db = NotsqlDB('myapp')
# カスタムパス
db = NotsqlDB('myapp', db_path='/custom/path')
```
### インデックスの活用
```python
# よく検索されるフィールドにインデックスを作成
users.create_index('email')
users.create_index('created_at')
# 複合的な検索パターンの場合
products.create_index('category')
products.create_index('price')
```
## 🚨 制限事項
1. **ファイルサイズ**: 大量のデータには適さない
2. **同時アクセス**: 高負荷な同時アクセスには制限がある
3. **トランザクション**: ACID特性は保証されない
4. **クエリパフォーマンス**: 複雑なクエリは性能に影響する
## 🤝 使用例とベストプラクティス
### 適切な使用例
- 設定ファイルの管理
- 小規模なWebアプリケーション
- プロトタイプ開発
- ローカルデータの保存
- テスト環境でのデータ管理
### 推奨事項
1. **インデックス戦略**: よく検索されるフィールドにインデックスを作成
2. **データ構造**: ネストを適度に保つ
3. **バックアップ**: 定期的なデータファイルのバックアップ
4. **監視**: データファイルサイズの監視
## 📚 API リファレンス
### NotsqlDB クラス
```python
class NotsqlDB:
def __init__(self, db_name: str, db_path: str = None)
def collection(self, name: str) -> Collection
def list_collections(self) -> List[str]
def drop_collection(self, name: str) -> bool
def drop_database(self)
def get_stats(self) -> Dict[str, Any]
```
### Collection クラス
```python
class Collection:
def insert_one(self, document: Dict[str, Any]) -> str
def insert_many(self, documents: List[Dict[str, Any]]) -> List[str]
def find_one(self, query: Dict[str, Any] = None) -> Optional[Dict[str, Any]]
def find(self, query: Dict[str, Any] = None, limit: int = None,
skip: int = 0, sort: Dict[str, int] = None) -> List[Dict[str, Any]]
def update_one(self, query: Dict[str, Any], update: Dict[str, Any]) -> bool
def update_many(self, query: Dict[str, Any], update: Dict[str, Any]) -> int
def delete_one(self, query: Dict[str, Any]) -> bool
def delete_many(self, query: Dict[str, Any]) -> int
def count_documents(self, query: Dict[str, Any] = None) -> int
def create_index(self, field_name: str, unique: bool = False) -> bool
def drop_index(self, field_name: str) -> bool
def list_indexes(self) -> List[str]
def drop(self)
```
## 📝 ライセンス
MIT License
Raw data
{
"_id": null,
"home_page": "https://github.com/tikipiya/notsql",
"name": "notsql",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": null,
"author": "tikisan",
"author_email": "s2501082@sendai-nct.jp",
"download_url": "https://files.pythonhosted.org/packages/73/77/43328f01b3510abb6eb5ed84c947ffc2d8d4acb5993a06856c5b50cbaeca/notsql-1.0.0.tar.gz",
"platform": null,
"description": "# Notsql - JSON\u30d9\u30fc\u30b9\u306e\u7c21\u6613NoSQL DB\r\n\r\n**Notsql**\u306f\u3001JSON\u30d5\u30a1\u30a4\u30eb\u30d9\u30fc\u30b9\u306e\u7c21\u6613NoSQL \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30e9\u30a4\u30d6\u30e9\u30ea\u3067\u3059\u3002MongoDB\u30e9\u30a4\u30af\u306a\u69cb\u6587\u3092\u63d0\u4f9b\u3057\u3001\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981\u3067\u5c0f\u898f\u6a21\u306a\u30b5\u30fc\u30d3\u30b9\u3084\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u6700\u9069\u3067\u3059\u3002\r\n\r\n## \ud83d\ude80 \u7279\u5fb4\r\n\r\n- **\ud83d\udcc1 \u30d5\u30a1\u30a4\u30eb\u30d9\u30fc\u30b9**: JSON\u30d5\u30a1\u30a4\u30eb\u306b\u3088\u308b\u30c7\u30fc\u30bf\u4fdd\u5b58\r\n- **\ud83d\udd0d Mongo\u30e9\u30a4\u30af\u306a\u69cb\u6587**: \u4f7f\u3044\u6163\u308c\u305fMongoDB\u306e\u30af\u30a8\u30ea\u69cb\u6587\r\n- **\u26a1 \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u4e0d\u8981**: \u5916\u90e8\u4f9d\u5b58\u306a\u3057\r\n- **\ud83d\udd10 \u540c\u6642\u30a2\u30af\u30bb\u30b9\u5bfe\u5fdc**: \u30d5\u30a1\u30a4\u30eb\u30ed\u30c3\u30af\u6a5f\u80fd\r\n- **\ud83d\udcca \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6a5f\u80fd**: \u9ad8\u901f\u691c\u7d22\u306e\u305f\u3081\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\r\n- **\ud83c\udfaf \u5c0f\u898f\u6a21\u30b5\u30fc\u30d3\u30b9\u5411\u3051**: \u8efd\u91cf\u3067\u7c21\u5358\u306b\u5c0e\u5165\u53ef\u80fd\r\n\r\n## \ud83d\udce6 \u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\r\n\r\n```bash\r\npip install notsql\r\n```\r\n\r\n## \ud83c\udfaf \u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\r\n\r\n### \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\r\n\r\n```python\r\nfrom notsql import NotsqlDB\r\n\r\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210\u30fb\u63a5\u7d9a\r\ndb = NotsqlDB('myapp')\r\n\r\n# \u7279\u5b9a\u306e\u30d1\u30b9\u3092\u6307\u5b9a\r\ndb = NotsqlDB('myapp', db_path='/path/to/data')\r\n```\r\n\r\n### \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u64cd\u4f5c\r\n\r\n```python\r\n# \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\r\nusers = db.collection('users')\r\n```\r\n\r\n### \u633f\u5165\u64cd\u4f5c\r\n\r\n```python\r\n# \u5358\u4e00\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u633f\u5165\r\nuser_id = users.insert_one({\r\n 'name': 'Alice',\r\n 'age': 30,\r\n 'email': 'alice@example.com'\r\n})\r\n\r\n# \u8907\u6570\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u633f\u5165\r\nuser_ids = users.insert_many([\r\n {'name': 'Bob', 'age': 25},\r\n {'name': 'Charlie', 'age': 35}\r\n])\r\n```\r\n\r\n### \u691c\u7d22\u64cd\u4f5c\r\n\r\n```python\r\n# \u5358\u4e00\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u691c\u7d22\r\nuser = users.find_one({'name': 'Alice'})\r\n\r\n# \u5168\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u691c\u7d22\r\nall_users = users.find()\r\n\r\n# \u6761\u4ef6\u4ed8\u304d\u691c\u7d22\r\nadults = users.find({'age': {'$gte': 18}})\r\n\r\n# \u5236\u9650\u3068\u30b9\u30ad\u30c3\u30d7\r\nrecent_users = users.find({}, limit=10, skip=5)\r\n\r\n# \u30bd\u30fc\u30c8\r\nsorted_users = users.find({}, sort={'age': -1}) # \u964d\u9806\r\n```\r\n\r\n### \u66f4\u65b0\u64cd\u4f5c\r\n\r\n```python\r\n# \u5358\u4e00\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u66f4\u65b0\r\nusers.update_one(\r\n {'name': 'Alice'},\r\n {'$set': {'age': 31}}\r\n)\r\n\r\n# \u8907\u6570\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u66f4\u65b0\r\nusers.update_many(\r\n {'age': {'$lt': 18}},\r\n {'$set': {'category': 'minor'}}\r\n)\r\n```\r\n\r\n### \u524a\u9664\u64cd\u4f5c\r\n\r\n```python\r\n# \u5358\u4e00\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u524a\u9664\r\nusers.delete_one({'name': 'Alice'})\r\n\r\n# \u8907\u6570\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u524a\u9664\r\nusers.delete_many({'age': {'$lt': 18}})\r\n```\r\n\r\n## \ud83d\udd0d \u30af\u30a8\u30ea\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n### \u6bd4\u8f03\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n```python\r\n# \u7b49\u4fa1\r\nusers.find({'age': 30})\r\nusers.find({'age': {'$eq': 30}})\r\n\r\n# \u4e0d\u7b49\u4fa1\r\nusers.find({'age': {'$ne': 30}})\r\n\r\n# \u5927\u306a\u308a\u30fb\u5c0f\u306a\u308a\r\nusers.find({'age': {'$gt': 25}}) # >\r\nusers.find({'age': {'$gte': 25}}) # >=\r\nusers.find({'age': {'$lt': 35}}) # <\r\nusers.find({'age': {'$lte': 35}}) # <=\r\n\r\n# \u7bc4\u56f2\r\nusers.find({'age': {'$in': [25, 30, 35]}})\r\nusers.find({'age': {'$nin': [25, 30, 35]}})\r\n```\r\n\r\n### \u8ad6\u7406\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n```python\r\n# AND\r\nusers.find({'$and': [\r\n {'age': {'$gte': 25}},\r\n {'age': {'$lte': 35}}\r\n]})\r\n\r\n# OR\r\nusers.find({'$or': [\r\n {'age': {'$lt': 25}},\r\n {'age': {'$gt': 35}}\r\n]})\r\n\r\n# NOT\r\nusers.find({'$not': {'age': {'$gte': 18}}})\r\n```\r\n\r\n### \u914d\u5217\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n```python\r\n# \u914d\u5217\u5185\u306e\u8981\u7d20\u3092\u691c\u7d22\r\nusers.find({'tags': {'$in': ['python', 'javascript']}})\r\n\r\n# \u914d\u5217\u306e\u30b5\u30a4\u30ba\r\nusers.find({'tags': {'$size': 3}})\r\n\r\n# \u914d\u5217\u306e\u5168\u8981\u7d20\u304c\u30de\u30c3\u30c1\r\nusers.find({'tags': {'$all': ['python', 'programming']}})\r\n\r\n# \u914d\u5217\u5185\u306e\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30de\u30c3\u30c1\r\nusers.find({'scores': {'$elemMatch': {'subject': 'math', 'score': {'$gte': 80}}}})\r\n```\r\n\r\n### \u6587\u5b57\u5217\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n```python\r\n# \u6b63\u898f\u8868\u73fe\r\nusers.find({'name': {'$regex': r'^A.*'}})\r\n\r\n# \u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u7121\u8996\r\nusers.find({'name': {'$regex': r'^alice', '$options': 'i'}})\r\n```\r\n\r\n### \u5b58\u5728\u30c1\u30a7\u30c3\u30af\r\n\r\n```python\r\n# \u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u5b58\u5728\r\nusers.find({'email': {'$exists': True}})\r\n\r\n# \u578b\u30c1\u30a7\u30c3\u30af\r\nusers.find({'age': {'$type': 'int'}})\r\n```\r\n\r\n## \ud83c\udfaf \u66f4\u65b0\u30aa\u30da\u30ec\u30fc\u30bf\u30fc\r\n\r\n```python\r\n# \u5024\u306e\u8a2d\u5b9a\r\nusers.update_one({'name': 'Alice'}, {'$set': {'age': 31}})\r\n\r\n# \u5024\u306e\u524a\u9664\r\nusers.update_one({'name': 'Alice'}, {'$unset': {'age': 1}})\r\n\r\n# \u6570\u5024\u306e\u5897\u6e1b\r\nusers.update_one({'name': 'Alice'}, {'$inc': {'age': 1}})\r\n\r\n# \u914d\u5217\u3078\u306e\u8ffd\u52a0\r\nusers.update_one({'name': 'Alice'}, {'$push': {'tags': 'new_tag'}})\r\n\r\n# \u914d\u5217\u304b\u3089\u524a\u9664\r\nusers.update_one({'name': 'Alice'}, {'$pull': {'tags': 'old_tag'}})\r\n\r\n# \u914d\u5217\u3078\u306e\u91cd\u8907\u306a\u3057\u8ffd\u52a0\r\nusers.update_one({'name': 'Alice'}, {'$addToSet': {'tags': 'unique_tag'}})\r\n```\r\n\r\n## \ud83d\udcca \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6a5f\u80fd\r\n\r\n```python\r\n# \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\r\nusers.create_index('email')\r\n\r\n# \u30e6\u30cb\u30fc\u30af\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\r\nusers.create_index('email', unique=True)\r\n\r\n# \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u524a\u9664\r\nusers.drop_index('email')\r\n\r\n# \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4e00\u89a7\r\nindexes = users.list_indexes()\r\n```\r\n\r\n## \ud83d\uddc2\ufe0f \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u7ba1\u7406\r\n\r\n```python\r\n# \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u4e00\u89a7\r\ncollections = db.list_collections()\r\n\r\n# \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u524a\u9664\r\ndb.drop_collection('users')\r\n\r\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u524a\u9664\r\ndb.drop_database()\r\n\r\n# \u7d71\u8a08\u60c5\u5831\r\nstats = db.get_stats()\r\n```\r\n\r\n## \ud83c\udfa8 \u5b9f\u7528\u4f8b\r\n\r\n### \u30d6\u30ed\u30b0\u30b7\u30b9\u30c6\u30e0\r\n\r\n```python\r\nfrom notsql import NotsqlDB\r\n\r\n# \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\r\ndb = NotsqlDB('blog')\r\n\r\n# \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u4f5c\u6210\r\nusers = db.collection('users')\r\nposts = db.collection('posts')\r\ncomments = db.collection('comments')\r\n\r\n# \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4f5c\u6210\r\nusers.create_index('email', unique=True)\r\nposts.create_index('author_id')\r\ncomments.create_index('post_id')\r\n\r\n# \u30e6\u30fc\u30b6\u30fc\u4f5c\u6210\r\nuser_id = users.insert_one({\r\n 'name': 'Alice',\r\n 'email': 'alice@example.com',\r\n 'role': 'author'\r\n})\r\n\r\n# \u6295\u7a3f\u4f5c\u6210\r\npost_id = posts.insert_one({\r\n 'title': 'Python\u5165\u9580',\r\n 'content': 'Python\u306e\u57fa\u672c\u7684\u306a\u4f7f\u3044\u65b9\u306b\u3064\u3044\u3066',\r\n 'author_id': user_id,\r\n 'tags': ['python', 'programming'],\r\n 'status': 'published'\r\n})\r\n\r\n# \u30b3\u30e1\u30f3\u30c8\u4f5c\u6210\r\ncomments.insert_one({\r\n 'post_id': post_id,\r\n 'author_id': user_id,\r\n 'content': '\u3068\u3066\u3082\u53c2\u8003\u306b\u306a\u308a\u307e\u3057\u305f\uff01'\r\n})\r\n\r\n# \u691c\u7d22\r\npublished_posts = posts.find({'status': 'published'})\r\npython_posts = posts.find({'tags': {'$in': ['python']}})\r\n```\r\n\r\n### EC\u30b5\u30a4\u30c8\r\n\r\n```python\r\n# \u5546\u54c1\u7ba1\u7406\r\nproducts = db.collection('products')\r\norders = db.collection('orders')\r\n\r\n# \u5546\u54c1\u30c7\u30fc\u30bf\r\nproducts.insert_many([\r\n {\r\n 'name': '\u30ce\u30fc\u30c8PC',\r\n 'category': 'electronics',\r\n 'price': 80000,\r\n 'stock': 10\r\n },\r\n {\r\n 'name': '\u30de\u30a6\u30b9',\r\n 'category': 'electronics',\r\n 'price': 2000,\r\n 'stock': 50\r\n }\r\n])\r\n\r\n# \u4fa1\u683c\u5e2f\u3067\u306e\u691c\u7d22\r\naffordable_products = products.find({'price': {'$lte': 50000}})\r\n\r\n# \u5728\u5eab\u306e\u3042\u308b\u5546\u54c1\r\nin_stock = products.find({'stock': {'$gt': 0}})\r\n```\r\n\r\n## \ud83d\udd27 \u8a2d\u5b9a\u3068\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\r\n\r\n### \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\r\n\r\n```python\r\n# \u30c7\u30d5\u30a9\u30eb\u30c8: ./data/database_name/\r\ndb = NotsqlDB('myapp')\r\n\r\n# \u30ab\u30b9\u30bf\u30e0\u30d1\u30b9\r\ndb = NotsqlDB('myapp', db_path='/custom/path')\r\n```\r\n\r\n### \u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u6d3b\u7528\r\n\r\n```python\r\n# \u3088\u304f\u691c\u7d22\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\r\nusers.create_index('email')\r\nusers.create_index('created_at')\r\n\r\n# \u8907\u5408\u7684\u306a\u691c\u7d22\u30d1\u30bf\u30fc\u30f3\u306e\u5834\u5408\r\nproducts.create_index('category')\r\nproducts.create_index('price')\r\n```\r\n\r\n## \ud83d\udea8 \u5236\u9650\u4e8b\u9805\r\n\r\n1. **\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba**: \u5927\u91cf\u306e\u30c7\u30fc\u30bf\u306b\u306f\u9069\u3055\u306a\u3044\r\n2. **\u540c\u6642\u30a2\u30af\u30bb\u30b9**: \u9ad8\u8ca0\u8377\u306a\u540c\u6642\u30a2\u30af\u30bb\u30b9\u306b\u306f\u5236\u9650\u304c\u3042\u308b\r\n3. **\u30c8\u30e9\u30f3\u30b6\u30af\u30b7\u30e7\u30f3**: ACID\u7279\u6027\u306f\u4fdd\u8a3c\u3055\u308c\u306a\u3044\r\n4. **\u30af\u30a8\u30ea\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9**: \u8907\u96d1\u306a\u30af\u30a8\u30ea\u306f\u6027\u80fd\u306b\u5f71\u97ff\u3059\u308b\r\n\r\n## \ud83e\udd1d \u4f7f\u7528\u4f8b\u3068\u30d9\u30b9\u30c8\u30d7\u30e9\u30af\u30c6\u30a3\u30b9\r\n\r\n### \u9069\u5207\u306a\u4f7f\u7528\u4f8b\r\n\r\n- \u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u7ba1\u7406\r\n- \u5c0f\u898f\u6a21\u306aWeb\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\r\n- \u30d7\u30ed\u30c8\u30bf\u30a4\u30d7\u958b\u767a\r\n- \u30ed\u30fc\u30ab\u30eb\u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\r\n- \u30c6\u30b9\u30c8\u74b0\u5883\u3067\u306e\u30c7\u30fc\u30bf\u7ba1\u7406\r\n\r\n### \u63a8\u5968\u4e8b\u9805\r\n\r\n1. **\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6226\u7565**: \u3088\u304f\u691c\u7d22\u3055\u308c\u308b\u30d5\u30a3\u30fc\u30eb\u30c9\u306b\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\r\n2. **\u30c7\u30fc\u30bf\u69cb\u9020**: \u30cd\u30b9\u30c8\u3092\u9069\u5ea6\u306b\u4fdd\u3064\r\n3. **\u30d0\u30c3\u30af\u30a2\u30c3\u30d7**: \u5b9a\u671f\u7684\u306a\u30c7\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\r\n4. **\u76e3\u8996**: \u30c7\u30fc\u30bf\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u76e3\u8996\r\n\r\n## \ud83d\udcda API \u30ea\u30d5\u30a1\u30ec\u30f3\u30b9\r\n\r\n### NotsqlDB \u30af\u30e9\u30b9\r\n\r\n```python\r\nclass NotsqlDB:\r\n def __init__(self, db_name: str, db_path: str = None)\r\n def collection(self, name: str) -> Collection\r\n def list_collections(self) -> List[str]\r\n def drop_collection(self, name: str) -> bool\r\n def drop_database(self)\r\n def get_stats(self) -> Dict[str, Any]\r\n```\r\n\r\n### Collection \u30af\u30e9\u30b9\r\n\r\n```python\r\nclass Collection:\r\n def insert_one(self, document: Dict[str, Any]) -> str\r\n def insert_many(self, documents: List[Dict[str, Any]]) -> List[str]\r\n def find_one(self, query: Dict[str, Any] = None) -> Optional[Dict[str, Any]]\r\n def find(self, query: Dict[str, Any] = None, limit: int = None, \r\n skip: int = 0, sort: Dict[str, int] = None) -> List[Dict[str, Any]]\r\n def update_one(self, query: Dict[str, Any], update: Dict[str, Any]) -> bool\r\n def update_many(self, query: Dict[str, Any], update: Dict[str, Any]) -> int\r\n def delete_one(self, query: Dict[str, Any]) -> bool\r\n def delete_many(self, query: Dict[str, Any]) -> int\r\n def count_documents(self, query: Dict[str, Any] = None) -> int\r\n def create_index(self, field_name: str, unique: bool = False) -> bool\r\n def drop_index(self, field_name: str) -> bool\r\n def list_indexes(self) -> List[str]\r\n def drop(self)\r\n```\r\n\r\n## \ud83d\udcdd \u30e9\u30a4\u30bb\u30f3\u30b9\r\n\r\nMIT License\r\n",
"bugtrack_url": null,
"license": null,
"summary": "JSON\u30d9\u30fc\u30b9\u306e\u7c21\u6613NoSQL DB\uff08\u30d5\u30a1\u30a4\u30eb\u4fdd\u5b58\u578b\uff09",
"version": "1.0.0",
"project_urls": {
"Homepage": "https://github.com/tikipiya/notsql"
},
"split_keywords": [],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "7f95a75ca08e68b40fbce11b9a45e22554ff23f9dbc88da77b00510da0befb25",
"md5": "174df658e3132a3560559818c38e3acf",
"sha256": "314c506eb38a7d8a9f91b4ad8174704fa86b91b0ed4849c846767f5f1ad1e670"
},
"downloads": -1,
"filename": "notsql-1.0.0-py3-none-any.whl",
"has_sig": false,
"md5_digest": "174df658e3132a3560559818c38e3acf",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.7",
"size": 12651,
"upload_time": "2025-07-09T03:45:18",
"upload_time_iso_8601": "2025-07-09T03:45:18.236452Z",
"url": "https://files.pythonhosted.org/packages/7f/95/a75ca08e68b40fbce11b9a45e22554ff23f9dbc88da77b00510da0befb25/notsql-1.0.0-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "737743328f01b3510abb6eb5ed84c947ffc2d8d4acb5993a06856c5b50cbaeca",
"md5": "50f03321657cf43b5047b0ee8ab2cbd3",
"sha256": "4131edf77fe4dece0db3a51c51a8cbcd72f8f73629b4ef5ae480630a1b257689"
},
"downloads": -1,
"filename": "notsql-1.0.0.tar.gz",
"has_sig": false,
"md5_digest": "50f03321657cf43b5047b0ee8ab2cbd3",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 10666,
"upload_time": "2025-07-09T03:45:19",
"upload_time_iso_8601": "2025-07-09T03:45:19.669746Z",
"url": "https://files.pythonhosted.org/packages/73/77/43328f01b3510abb6eb5ed84c947ffc2d8d4acb5993a06856c5b50cbaeca/notsql-1.0.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-09 03:45:19",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "tikipiya",
"github_project": "notsql",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"lcname": "notsql"
}