2011-01-03 4 views
19

私は製品リストを持っています。私はMongoDBに挿入されたドキュメントの_idを取得しますか?

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

のようなものを使用して、それを保存する新製品を追加すると、問題は、これは、製品のページにユーザーをリダイレクトするために行われた後、私が欲しいということです。だから私は、私は手動でデータベースを照会し、すべて同じフィールドと、そのような文書で探しせずに右のその後のObjectIDを得るための手立てを見ていない、しかし/products/<ObjectID>

を言うためにリダイレクトする必要があります。

もっと簡単な方法はありますか?

答えて

31

あなたは挿入文書のidフィールドを確認することができます(また、この例ではdocは、何らかの理由でnullを返します)。これは、記入する必要があります

をアスカー編:。

ちょうどあなたがちょうど使用する独自のクラスにidフィールドを作るためには、明確にする:

[BsonId] 
public ObjectId ID{get;set;} 
10

オブジェクトを挿入するとき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 
}); 
3

場合、

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

であなたのモデルにFILD IDを追加使用:

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

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

0

あなたは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>(); 

それでもあなたは選ばれた解答のように専用のプロパティを持つprefereなければならないが...