我在mongodb中收集了这样的内容:
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字段,因为我从未在Customer构造函数中设置它。
如您所见,Adr字段存储来自Adresses集合的Address doc的ObjectId。 如果我需要查找给定文档的地址详细信息,我可以使用adrfield,获取id然后查询地址集合。
这是我的问题(或担忧): 添加新客户时,它没有地址。地址稍后添加。 我希望adrfield在创建新客户时为null或为空。 但我得到ObjectId(“000000000000000000000000”)而不是
我还需要在地址字段上创建索引,如果我有大量客户使用adr = ObjectId(“000000000000000000000000”),它是否会产生任何问题?
更新后的代码:
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();
}
如何解决此问题?
由于
答案 0 :(得分:0)
您确实没有发布足够的代码供任何人专门回答您的问题。当代表不是实际问题的地方时,伪代码和骷髅可能会很好,但是在这种情况下,你显然有一些写回来导致问题并且你没有显示它。
那说你在这里要做的几乎肯定是你不想要的。您似乎试图遵循一种关系模式,说“我在这个其他集合中有一堆地址信息,我只想在本文档中保留对我想要的那个的引用。”
现在在某些情况下可能会很好,但地址信息似乎微不足道,应该真正嵌入主文档中作为子文档。所以你很可能会考虑嵌入并开始失去你的关系思路。
即使在关系世界中,一个真实案例就是订单上的客户地址。由于人们一直在更改地址,因此在订单上引用地址的ID是没有意义的。保留一些旧地址的地址记录是过度的。虽然我已经看到它已经完成(并且有很多),但最佳做法是将地址信息存储在文档中。
他们网站上的MongoDB文档在Data Modelling上有一些非常好的阅读。我建议你花点时间仔细看看。值得的东西:)
答案 1 :(得分:0)
我找到了解决方案!添加BsonIgnore解决了我的问题。 谢谢大家为您提供宝贵的意见