NodejsはMongoDBコレクション_idの種類を判断します

背景:

  1. MongoDB では、_id フィールドはコレクションを表す主キーであり、各ドキュメントを一意に識別します。

  1. デフォルトの _id を使用する:デフォルトでは、コレクションにドキュメントを挿入するときに、フィールド名に _id のフィールド名がない場合、MongoDB は自動的に ObjectId フィールドを追加します。

  1. カスタム _id フィールド:ドキュメントによって表示される "_id" フィールドをコレクションに追加すると、MongoDB はデフォルトで _id フィールドを生成せず、指定した "_id" フィールドを使用します。

  1. MongoDB を使用する場合、上記の 2 つの方法で _id を生成します。一意の ID を使用する必要があるドキュメントについては独自に生成し、それ以外の場合は MongoDB によって自動的に生成された _id を使用します。

発生した問題:

  1. 弊社の _id は 2 つの生成方法があるため、nodejs を使用して MongoDB を操作する場合、削除および更新する場合、_id フィールドの型の問題により更新および削除ができません

  1. コレクションが MongoDB によって自動的に生成された _id を使用する場合、操作時に次のように記述する必要があります: {_id: new ObjectID(_id)}

_id フィールドのタイプを区別するにはどうすればよいですか?

  1. 自分で生成する_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;
  1. ドキュメントを更新します。

  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);
  1. 文書を削除します:

  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 タイプを生成します。

おすすめ

転載: blog.csdn.net/duzm200542901104/article/details/129503743