说我有一个产品清单。当我添加一个新产品时,我会使用类似的东西来保存它
var doc=products.Insert<ProductPDO>(p);
问题是我希望在完成此操作后将用户重定向到产品页面。所以我需要重定向说/products/<ObjectID>
但是,如果不手动查询数据库并查找具有所有相同字段等的文档,我就无法立即获取 ObjectID。
有没有更简单的方法?(此外,doc
在这种情况下,由于某种原因返回 null)
说我有一个产品清单。当我添加一个新产品时,我会使用类似的东西来保存它
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.collection('collectionName', function(err, collection) {
collection.insert(data);
console.log(data._id); // <- The mongodb id is now set on the item
});
正如上面的评论,在你的模型中添加 fild 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。
它在代码中创建 Id 本身,而不是委托给 Mongo DB 来创建它。但我的情况就足够了。
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();
2021:如果您使用带有 C#9record
的 MongoDb,则可以使用此 hack 获取插入的 id:
private async Task<T> AddEntity<T>(T entity, string collectionName) where T: EntityBase
{
var col = _db.GetCollection<BsonDocument>(collectionName);
var document = entity.ToBsonDocument();
document["_id"] = ObjectId.Empty;
await col.InsertOneAsync(document);
var insertedEntity = entity with
{
id = document["_id"].ToString()!
};
return insertedEntity;
}
所有具有字段EntityBase
的文档的基本实体在哪里。id
或者只是不使用泛型。