37

说我有一个产品清单。当我添加一个新产品时,我会使用类似的东西来保存它

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

问题是我希望在完成此操作后将用户重定向到产品页面。所以我需要重定向说/products/<ObjectID>

但是,如果不手动查询数据库并查找具有所有相同字段等的文档,我就无法立即获取 ObjectID。

有没有更简单的方法?(此外,doc在这种情况下,由于某种原因返回 null)

4

7 回答 7

67

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
于 2011-01-03T08:11:46.293 回答
19

当您将对象插入 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
});
于 2012-12-14T06:22:42.633 回答
6

正如上面的评论,在你的模型中添加 fild ID

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

使用:

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

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

于 2017-07-26T15:15:10.707 回答
2

如果您知道 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>();

您仍然应该像所选答案中那样拥有专用属性...

于 2018-03-01T12:11:48.887 回答
1

我在持久化之前将自定义类型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 来创建它。但我的情况就足够了。

于 2019-06-04T06:27:44.690 回答
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();
于 2020-05-27T01:20:22.433 回答
0

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或者只是不使用泛型。

于 2021-08-20T21:46:07.953 回答