背景:
MongoDB では、_id フィールドはコレクションを表す主キーであり、各ドキュメントを一意に識別します。
デフォルトの _id を使用する:デフォルトでは、コレクションにドキュメントを挿入するときに、フィールド名に _id のフィールド名がない場合、MongoDB は自動的に ObjectId フィールドを追加します。
カスタム _id フィールド:ドキュメントによって表示される "_id" フィールドをコレクションに追加すると、MongoDB はデフォルトで _id フィールドを生成せず、指定した "_id" フィールドを使用します。
MongoDB を使用する場合、上記の 2 つの方法で _id を生成します。一意の ID を使用する必要があるドキュメントについては独自に生成し、それ以外の場合は MongoDB によって自動的に生成された _id を使用します。
発生した問題:
弊社の _id は 2 つの生成方法があるため、nodejs を使用して MongoDB を操作する場合、削除および更新する場合、_id フィールドの型の問題により更新および削除ができません
コレクションが MongoDB によって自動的に生成された _id を使用する場合、操作時に次のように記述する必要があります: {_id: new ObjectID(_id)}
_id フィールドのタイプを区別するにはどうすればよいですか?
自分で生成する_idは文字列型ですが、MongoDBが自動生成する_idはObjectID型ですが、_idの型はどうやって判断するのでしょうか?
2. 当初はMongoDBのコレクションAPIで_idの種類を判断したかったのですが、長時間探しても該当するAPIが見つかりませんでした(ご存知の方は教えてください、ありがとうございます)
3. コレクションには対応する API がないため、_id の型はクエリ結果からのみ判断できます。
var url = 'mongodb://' + username + ':' + password+'@' + ip + ":"+port + "/" + dbName;
let client = new MongoClient(url);
await client.connect();
let db = client.db(dbName);
let collection = db.collection(collectionName);
let data = await collection.find(JSON.parse(filter)).sort(JSON.parse(sort)).limit(limit).skip(skip).toArray();
let result = new Object();
result.isObjectId = false;
if (data.length !== 0) {
if ('[object Object]' === Object.prototype.toString.call(data[0]._id)) {
result.isObjectId = true;
}
}
result.data = data;
return result;
ドキュメントを更新します。
var url = 'mongodb://' + username + ':' + password+'@' + ip + ":"+port + "/" + dbName;
let client = new MongoClient(url);
await client.connect();
let db = client.db(dbName);
let collection = db.collection(collectionName);
if (isObjectId) {
return collection.replaceOne({_id: new ObjectID(filter)}, doc);
}
return collection.replaceOne({_id: filter}, doc);
文書を削除します:
var url = 'mongodb://' + username + ':' + password+'@' + ip + ":"+port + "/" + dbName;
let client = new MongoClient(url);
await client.connect();
let db = client.db(dbName);
let collection = db.collection(collectionName);
if (isObjectId) {
return collection.deleteOne({_id: new ObjectID(filter)});
}
return collection.deleteOne({_id: filter});
要約:
現在クエリされている各ドキュメントの _id タイプを記録し、更新時に _id タイプに従って対応する _id タイプを生成します。