我在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字段,因为我从未在客户构造函数.中设置过Adr字段。
如您所见,Adr字段存储地址文档的ObjectId。如果需要查找给定文档的地址细节,可以使用adrfield,获取id,然后查询address集合。
这是我的问题(或关注):当添加一个新客户时,它没有地址。稍后添加地址。创建新客户时,我希望adrfield为空或空。但是我得到了ObjectId(“0000000000000000000000”)
我还需要在address字段上创建一个索引,如果我有大量的adr=ObjectId客户(“0000000000000000000000”),它不会产生任何问题吗?
更新代码:
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();
}我如何解决这个问题?
谢谢
发布于 2014-02-02 08:39:55
你真的没有发布足够的代码让任何人专门回答你的问题。如果表示不是实际问题所在,那么伪代码和骨架可能是很好的,但是在这种情况下,很明显,您有一些东西正在回写导致问题,而您并没有显示它。
也就是说,你在这里试图做的事情几乎肯定是你不想要的。您似乎在试图遵循一种关系模式,即“我在另一个集合中有一堆地址信息,我只想在本文档中保留对我想要的地址的引用。”
现在,在某些情况下,这可能是很好的,但地址信息似乎微不足道,应该作为子文档嵌入主文档中。因此,您应该非常可能考虑嵌入,并开始失去您的关系思路。
即使在关系世界中,一个真实的例子就是客户对订单的依赖。当人们一直在更改地址时,引用一个地址的id是没有意义的。为某个人的旧地址保留一个地址记录太过分了。尽管我已经看到了它,但最好的做法是将地址信息存储在文档中。
他们网站上的MongoDB文档在数据建模上有一些非常好的阅读。我建议你花点时间好好看看。(有价值的东西:)
发布于 2014-02-02 18:42:47
我找到解决办法了!添加一个BsonIgnore解决了我的问题。谢谢大家宝贵的意见。
https://stackoverflow.com/questions/21508154
复制相似问题