推送不适用于子子阵列

时间:2014-05-25 21:19:16

标签: c# mongodb

我有以下架构:

{
    "_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响应,但影响了零行。

2 个答案:

答案 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#驱动程序的第一步。