我有以下架构:
{
"_id" : ObjectId("537ba668a9df7408986afc05"),
"AppName" : "My App",
"AppId" : "123",
"AppGreetingText" : "Thank you!",
"AppGreetingImageUrl" : "http://www.cute-wallpaper.com/backgrounds/rainbow/colorful_rainbow_party.jpg",
"DateCreated" : ISODate("2014-05-20T00:00:00.000Z"),
"AppUsers" : [
{
"uId" : 1
"Token" : "123",
"UserName" : "Donna Amhccijhfidb Sidhuwitz",
"ProfileImageUrl" : "1.png",
"Email" : "bla@bla.net",
"BookIds" : []
}
我想将新字符串推送到PostIds
。
var query = Query.And(
Query<App>.EQ(a => a.Id, entity.Id),
Query<AppUser>.EQ(u => u.uId, UserId)
);
var updateResult = this.MongoConnectionHandler.MongoCollection.Update(
query,
Update<AppUser>.Push(au => au.BookIds, bookId),
new MongoUpdateOptions()
{
WriteConcern = WriteConcern.Acknowledged,
});
我对子数组做了类似的事情,但对于子子数组似乎没有相同的作用,我无法弄清楚原因。如果相关,bookIds是POCO中的List<string>
。
编辑: Henk - 你是对的。 &#34;这似乎不起作用&#34;这意味着我希望将新字符串推入到数组中,但实际结果是它没有被推入数组并且数组保持为空,就像示例文档中的那样。我正在查看结果,我在WriteConcernResult
中找不到任何错误。我得到了"ok" : 1
响应,但影响了零行。
答案 0 :(得分:1)
我不确定通用API是否以这种方式工作。但是使用MongoDB C#Driver 1.8,我希望以下代码可以工作:
var query = Query.And(
Query.EQ("_id", entity.Id),
Query.EQ("AppUsers.uId", UserId)
);
var update = Update.Push("AppUsers.$.BookIds", bookId);
var updateResult = this.MongoConnectionHandler.MongoCollection.Update(
query, update);
我忽略了WriteConcern
部分,因为我认为Acknowledged
是默认设置。
答案 1 :(得分:0)
我一直都是这样做的。我不知道我在想什么,但我编写查询的方式并没有让我访问我需要的对象。我想访问一个子文档,无论我写什么类型的查询,我可以从集合对象中访问的是App
类型的实体。对此集合的任何查询只能返回完整的App
类型文档。
我需要做的是在我找到的单个App
文档中找到特定的子文档。我最终使用的代码是:
var query = Query<App>.EQ(a => a.Id, entity.Id);
var itemIndex = entity.AppUsers.FindIndex(u => u.Id == userId);
var updateResult = this.MongoConnectionHandler.MongoCollection.Update(
query,
Update<App>.Push(a => a.AppUsers[itemIndex].BookIds, bookId),
new MongoUpdateOptions()
{
WriteConcern = WriteConcern.Acknowledged,
});
现在一切似乎都很合乎逻辑,但正如他们所说的“后见之明总是20/20”。希望这可以帮助其他人迈出C#驱动程序的第一步。