web-dev-qa-db-ja.com

MongoDBに挿入されたドキュメントの_idを取得しますか?

製品リストがあると言います。新しい商品を追加するときは、次のような方法で保存します

var doc=products.Insert<ProductPDO>(p);

問題は、これが行われた後で、ユーザーを製品のページにリダイレクトすることです。ですから、/products/<ObjectID>にリダイレクトする必要があります

ただし、データベースに手動でクエリを実行せずにObjectIDをすぐに取得し、すべて同じフィールドなどを持つドキュメントを探す方法はありません。

もっと簡単な方法はありますか? (また、このインスタンスのdocは、何らかの理由でnullを返します)

29
Earlz

Insertメソッドは、モデルのBSON IDとして宣言されているプロパティを自動的に設定します。

次のように宣言した場合...

[BsonId]
public ObjectId Id { get; set; }

... Idフィールドには、オブジェクトをコレクションに挿入した後のオブジェクトのデフォルト(新規、一意)のBSON IDが含まれます。

coll.Insert(obj);
// obj.Id is now the BSON ID of the object
43
Scott Hernandez

オブジェクトをmongodbに挿入すると、mongoは内部IDでオブジェクトを更新します。

だから

data = {
  title: "Howdy"
}

次に、データオブジェクトをdbに挿入すると

db.collection('collectionName', function(err, collection) {
  collection.insert(data);
  console.log(data._id); // <- The mongodb id is now set on the item
});
14
Shaheen Ghiassy

上記のコメントとして、モデルにフィールドIDを追加します。

[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string id { get; set; }

使用:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;

その後、オブジェクトを挿入すると、mongoはドキュメントのIDをモデルのフィールドIDに返します。

4
Jorge Barraza Z

IDのタイプがわかっている場合は、次のようなことができます。

public static TId GetId<TId>(this BsonDocument document) where TId : struct
{
    if (document == default(BsonDocument))
    {
        throw new ArgumentNullException("document");
    }

    var id = document["_id"];

    object idAsObject;

    if (id.IsGuid)
    {
        idAsObject = (object)id.AsGuid;
    }
    else if (id.IsObjectId)
    {
        idAsObject = (object)id.AsObjectId;
    }
    else
    {
        throw new NotImplementedException(string.Format("Unknown _id type \"{0}\"", id.BsonType));
    }

    var idCasted = (TId)idAsObject;

    return idCasted;
}

次のように使用します。

Guid idOfDoc = myBsonDocument.GetId<Guid>();

それでも、あなたは選ばれた答えのように専用のプロパティを持つことを好むはずです...

0
CodingYourLife

永続化する前に、カスタムタイプTBsonDocumentに変換しています。

_var bsonDocument = item.ToBsonDocument();
_mongoCollection.InsertOne(bsonDocument);
_

TにはプロパティIDがあります:

_[BsonId]
public ObjectId Id { get; set; }
_

ToBsonDocument()を呼び出すと、IdフィールドにObjectIdが入力され、Mongo DBにプッシュされます。

作成するためにMongo DBに委任する代わりに、コード内でID自体を作成します。しかし、それは私のケースで十分です。

0
h-rai