Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取MongoDB中插入文档的\u id?_C#_Mongodb_Mongodb .net Driver - Fatal编程技术网

C# 获取MongoDB中插入文档的\u id?

C# 获取MongoDB中插入文档的\u id?,c#,mongodb,mongodb-.net-driver,C#,Mongodb,Mongodb .net Driver,假设我有一个产品清单。当我添加一个新产品时,我会使用以下方式保存它 var doc=products.Insert<ProductPDO>(p); var doc=products.Insert(p); 问题是,在完成此操作后,我希望将用户重定向到包含产品的页面。所以我需要重定向到/products/ 但是,如果不手动查询数据库并查找具有所有相同字段等的文档,我看不到任何方法可以在以后正确获取ObjectID 有没有更简单的方法?(另外,doc在本例中由于某种原因返回null)插

假设我有一个产品清单。当我添加一个新产品时,我会使用以下方式保存它

var doc=products.Insert<ProductPDO>(p);
var doc=products.Insert(p);
问题是,在完成此操作后,我希望将用户重定向到包含产品的页面。所以我需要重定向到
/products/

但是,如果不手动查询数据库并查找具有所有相同字段等的文档,我看不到任何方法可以在以后正确获取ObjectID


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

插入方法自动设置声明为模型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更新对象

所以如果

然后当我们将数据对象插入数据库时

db.collection('collectionName', function(err, collection) {
  collection.insert(data);
  console.log(data._id); // <- The mongodb id is now set on the item
});
db.collection('collectionName',函数(err,collection){
收集.插入(数据);

console.log(data._id);//作为上面的注释,使用

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

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

然后,当您插入对象时,mongo会将文档的ID返回到模型的fild 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>();
public static TId GetId(此BsonDocument文档),其中TId:struct
{
if(document==默认值(BsonDocument))
{
抛出新的异常(“文档”);
}
var id=文档[“_id”];
对象和对象;
if(id.IsGuid)
{
idAsObject=(对象)id.AsGuid;
}
else if(id.IsObjectId)
{
idAsObject=(object)id.AsObjectId;
}
其他的
{
抛出新的NotImplementedException(string.Format(“未知的_id类型\“{0}\”,id.BsonType));
}
变量idCasted=(TId)idAsObject;
返回idCasted;
}
像这样使用它:

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>();
Guid idOfDoc=myBsonDocument.GetId();

不过,您还是希望在所选答案中有一个专用属性…

我正在将自定义类型
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来创建它。但这就足够了。

classbsonid
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();
{ [BsonId] 公共对象Id{get;set;} } var文档=新的BsonDocument{ {“_id”,新的BsonID().id}, {“code”,dr.Cells[“code”].Value.ToString()}, {“name”,dr.Cells[“name”].Value.ToString()}, }; var customers=_database.GetCollection(“客户”); 客户。InsertOne(文件); var id=document.ElementAt(0.Value.ToString();
对于那些更新到.NET的对象,这仍然不清楚。我可以在哪个c sharp对象中提取新ID?您可以发布示例代码吗?您可以从插入的类对象中提取ObjectId(ID)。这只适用于insertOne?我似乎不适用于insertMany。。。