为什么mongodb ObjectId字段获取ObjectId的值(“000000000000000000000000000000”)?
我在mongodb中收集了如下内容:为什么mongodb ObjectId字段获取ObjectId的值(“000000000000000000000000000000”)?,mongodb,mongodb-.net-driver,Mongodb,Mongodb .net Driver,我在mongodb中收集了如下内容: Customers: { "_id" : ObjectId("52e9...55"), "Adr" : ObjectId("52d5e53a0d4aff04a8a36c34") .. } { "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..} { "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("234
Customers:
{ "_id" : ObjectId("52e9...55"), "Adr" : ObjectId("52d5e53a0d4aff04a8a36c34") .. }
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("23423...5675") }
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("000000000000000000000000") ..}
{ "_id" : ObjectId("52ea...e8"), "Adr" : ObjectId("34545...7677") ..}
创建时,我不想在客户文档中看到Adr字段,因为我从未在客户构造函数中设置过它。
如您所见,Adr字段存储ADRESS集合中地址文档的ObjectId。
如果我需要查找给定文档的地址详细信息,我可以使用ADR字段,获取id,然后查询地址集合
这是我的问题(或担忧):
添加新客户时,它没有地址。地址稍后添加。
我希望在创建新客户时,adrfield为null或空。
但我得到的是ObjectId(“000000000000000000000000000000”)
我还需要在地址字段上创建一个索引,如果我有大量adr=ObjectId(“000000000000000000000000000000”)的客户,这不会产生任何问题吗
更新代码:
public class Customer
{
//code removed for simplicity
public Customer()
{
Id = ObjectId.GenerateNewId();
//both of these works
Name = null;
Phone = string.Empty;
//Doesn't work & creates Adr field w/ ObjectId("000..000") instead of null
//cannot convert null to MongoDb.Bson.ObjectId because it is non-nullable value type
//Adr = null;
}
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("Name")]
public string Name { get; set; }
[BsonElement("Phone")]
public string Phone { get; set; }
//I added BsonIgnoreIfNull & didn't assign anything to Adr field in the constructor
//But I keep getting a value of ObjectId("000000000000000000000000") in the Adr field
[BsonElement("Adr"), BsonIgnoreIfNull]
public ObjectId Adr{ get; set; }
}
public class Address
{
public Address()
{
Id = ObjectId.GenerateNewId();
Street = null;
City = null;
State = null;
Country = null;
}
//STORED IN THE ADR FIELD OF THE Customers collection above
//DUE TO SOME SPECIFIC REASON I NEED SEPARATE COLLECTION FOR ADDRESS not embedding
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("Street")]
public string Street {get; set;}
[BsonElement("City")]
public string City {get; set;}
[BsonElement("State"), BsonIgnoreIfNull]
public string State {get; set;}
[BsonElement("Country")]
public string Country {get; set;}
}
Here is my MVC controller where I insert a new customer:
[HttpPost]
public ActionResult AddCustomer(string Name, string Phone){
//code removed for simplicity
Customer cust = new Customer();
cust.Name = name;
cust.Phone = phone;
CustomerService svc = new CustomerService();
svc.InsertCustomer(cust);
return Result();
}
我如何解决这个问题
谢谢您确实没有发布足够的代码供任何人专门回答您的问题。当表示不是实际问题所在的位置时,伪代码和骨架可能很好,但在本例中,您显然有导致问题的回写内容,而您没有显示它 也就是说,你在这里试图做的几乎肯定是你不想要的。您似乎试图遵循一种关系模式,即“我在另一个集合中有一堆地址信息,我只想在本文档中保留我想要的地址信息的引用。” 现在,在某些情况下,这可能很好,但地址信息似乎微不足道,应该作为子文档嵌入到主文档中。因此,您很可能正在考虑嵌入,并开始失去您的关系思路 即使在关系世界中,一个真实的例子是订单上的客户地址。在订单上引用地址id是没有意义的,因为人们一直在更改地址。而且为某人保留一个旧地址的地址记录也太过分了。虽然我看到过其他的做法(还有很多),但最好的做法是将地址信息存储在文档中
他们网站上的MongoDB文档有一些非常好的阅读材料。我建议你花点时间好好看看。有价值的东西:)我找到了解决办法!添加BsonIgnore解决了我的问题。
感谢大家的宝贵意见啊,你的模型错了。它们不是mongodb中的外键。请编辑您的帖子并包含更多代码。问题可能出在你所掩盖的东西上。预先警告一下,这个问题的答案会告诉你你做错了,你应该嵌入我认为要共享(或检查)的相关代码就是你创建客户文档的地方。您应该将
adr
字段设置为null
,并在创建地址时将其添加到客户文档中。通常,当您创建BsonDocument
时;在您的情况下,似乎始终设置了地址引用。伪零objectid不应引起索引问题,但它们可能会使您的应用程序逻辑复杂化,因为您有一个无效数据的特殊情况。请尝试添加属性[BsonIgnoreIfNull]
转到客户类别上的adr
字段。这完全取决于软件的用途以及地址是否应单独存储。最初的问题提到了数据存储方式和技术实现方面的知识。@WiredPairie抱歉,伙计,我知道你已经建立了一个代表,我确实喜欢你的很多答案,但作为一般建模方法,这种方法很糟糕,需要告诉人们。我说,我在relational中看到了这一点,并且($work为我的利益很高兴地修复了它),也就是说,我希望促进未来的努力,使之比我以前遇到的做得更好。这适用于RavenDB,但同样适用于MondoDB IMO。