在MongoDB中插入的文档的get_id?

k2fxgqgv  于 2022-10-22  发布在  Go
关注(0)|答案(8)|浏览(153)

假设我有一份产品清单。当我添加新产品时,我会使用如下内容保存它

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

问题是,我希望在此完成后,将用户重定向到带有产品的页面。所以我需要重定向到/products/<ObjectID>
然而,我认为如果不手动查询数据库并查找具有所有相同字段的文档,之后就无法获得正确的OBJECTID。
有没有更简单的方法?(此外,由于某些原因,此示例中的doc返回NULL)

v2g6jxz6

v2g6jxz61#

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
uinbv5nw

uinbv5nw2#

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

mrwjdhj33#

如上面的注解所示,使用以下命令在模型中添加文件ID

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

使用:

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

然后,当您插入对象时,mongo会将文档的ID返回到模型的文件ID中。

ctzwtxfj

ctzwtxfj4#

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

尽管如此,你还是应该有一个专门的属性,就像在选择的答案中一样。

iyfamqjs

iyfamqjs5#

在持久化之前,我要将定制类型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来创建它。但这对我来说已经足够了。

js4nwp54

js4nwp546#

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();
o3imoua4

o3imoua47#

2021:如果您正在使用带有C#9 record s的MongoDB,您可以使用此黑客来获取插入的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字段的所有文档的基本实体。或者只是不使用泛型。

kb5ga3dv

kb5ga3dv8#

Class.Type as a BsonDocument而不是真正的Class.Type可能是导致此问题的常见原因:
例如:

var stream = mDB.GetCollection<vStreamMessage>(dictINI[sMONGODB_COLLECTION_NAME]);
            stream.InsertOne(msg);

var stream = mDB.GetCollection<**BsonDocument**>(dictINI[sMONGODB_COLLECTION_NAME]);
            stream.InsertOne(**msg.ToBsonDocument**);

相关问题