说我有产品清单。当我添加新产品时,我使用
之类的东西保存它var doc=products.Insert<ProductPDO>(p);
问题是我想在完成此操作后将用户重定向到包含该产品的页面。所以我需要重定向才能说/products/<ObjectID>
但是,我认为无法在不手动查询数据库的情况下获取ObjectID,并查找具有所有相同字段等的文档。
有更简单的方法吗? (另外,此实例中的doc
由于某种原因返回null)
答案 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来创建它。但这足以满足我的要求。