获取MongoDB中插入文档的_id?

时间:2011-01-03 08:06:10

标签: c# mongodb mongodb-.net-driver

说我有产品清单。当我添加新产品时,我使用

之类的东西保存它
var doc=products.Insert<ProductPDO>(p);

问题是我想在完成此操作后将用户重定向到包含该产品的页面。所以我需要重定向才能说/products/<ObjectID>

但是,我认为无法在不手动查询数据库的情况下获取ObjectID,并查找具有所有相同字段等的文档。

有更简单的方法吗? (另外,此实例中的doc由于某种原因返回null)

6 个答案:

答案 0 :(得分:41)

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

答案 1 :(得分:14)

当您将对象插入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
});

答案 2 :(得分:4)

如上面的评论,使用

在模型中添加fild ID
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string id { get; set; }

使用:

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

然后在插入对象时,mongo将文档的ID返回到模型的fild ID中。

答案 3 :(得分:1)

class BsonID
{
    [BsonId]
    public ObjectId Id { get; set; }
}
var document = new BsonDocument {
   {"_id", new BsonID().Id },
   { "code", dr.Cells["code"].Value.ToString() },
   { "name", dr.Cells["name"].Value.ToString() },
  };
var customers = _database.GetCollection<BsonDocument>("Customers");
customers.InsertOne(document);
var id = document.ElementAt(0).Value.ToString();

答案 4 :(得分: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>();

仍然你应该优先选择一个专门的财产......

答案 5 :(得分:0)

在将其保留之前,我正在将自定义类型T转换为BsonDocument

var bsonDocument = item.ToBsonDocument();
_mongoCollection.InsertOne(bsonDocument);

T具有属性ID:

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

当我致电ToBsonDocument()时,Id字段中填充了ObjectId,该字段被推送到Mongo DB。

它在代码中创建ID本身,而不是委派给Mongo DB来创建它。但这足以满足我的要求。