製品リストがあると言います。新しい商品を追加するときは、次のような方法で保存します
var doc=products.Insert<ProductPDO>(p);
問題は、これが行われた後で、ユーザーを製品のページにリダイレクトすることです。ですから、/products/<ObjectID>
にリダイレクトする必要があります
ただし、データベースに手動でクエリを実行せずにObjectIDをすぐに取得し、すべて同じフィールドなどを持つドキュメントを探す方法はありません。
もっと簡単な方法はありますか? (また、このインスタンスのdoc
は、何らかの理由でnullを返します)
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
オブジェクトを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
});
上記のコメントとして、モデルにフィールドIDを追加します。
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string id { get; set; }
使用:
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
その後、オブジェクトを挿入すると、mongoはドキュメントのIDをモデルのフィールドIDに返します。
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>();
それでも、あなたは選ばれた答えのように専用のプロパティを持つことを好むはずです...
永続化する前に、カスタムタイプT
をBsonDocument
に変換しています。
_var bsonDocument = item.ToBsonDocument();
_mongoCollection.InsertOne(bsonDocument);
_
T
にはプロパティIDがあります:
_[BsonId]
public ObjectId Id { get; set; }
_
ToBsonDocument()
を呼び出すと、Id
フィールドにObjectId
が入力され、Mongo DBにプッシュされます。
作成するためにMongo DBに委任する代わりに、コード内でID自体を作成します。しかし、それは私のケースで十分です。