обновить n-й документ во вложенном массиве в mongodb

Мне нужно обновить документ в массиве внутри другого документа в Mongo DB


    {
            "_id" : ObjectId("51cff693d342704b5047e6d8"),
            "author" : "test",
            "body" : "sdfkj dsfhk asdfjad ",
            "comments" : [
                    {
                            "author" : "test",
                            "body" : "sdfkjdj\r\nasdjgkfdfj",
                            "email" : "[email protected]"
                    },
                    {
                            "author" : "hola",
                            "body" : "sdfl\r\nhola \r\nwork here"
                    }
            ],
            "date" : ISODate("2013-06-30T09:12:51.629Z"),
            "permalink" : "jaiho",
            "tags" : [
                    "jaiho"
            ],
            "title" : "JAiHo"
    }


Q1) Update email of 0th element of comments array
db.posts.update({"permalink" : "haha"},{$set:{"comments.0.email":1}})
This doesn't throw any exception but doesn't update anything as well
Q2) Add a field on nth element of comments array number_likes
db.posts.update({"permalink" : "haha"},{$inc:{"comments.0.num_likes":1}})
Doesn't work either.

Am I missing something here?

person Amit Sehgal    schedule 30.06.2013    source источник
comment
Лол, это почти наверняка из курса монго 10gen: P education.10gen.com/courses   -  person Mike Graf    schedule 01.08.2013
comment
Да, на самом деле, но я не смог найти, что пошло не так с решением, и не хотел проваливать тест;) Вы можете рассматривать это как обман, но, может быть, я все еще учусь.   -  person Amit Sehgal    schedule 13.08.2013
comment
Нет, все хорошо. Это просто рассмешило меня.   -  person Mike Graf    schedule 14.08.2013


Ответы (2)


Q1: Если вы обновляете постоянную ссылку «jaiho» вместо «ха-ха», это наверняка обновит электронную почту;

> db.posts.update({"permalink" : "jaiho"},{$set:{"comments.0.email":1}})
> db.posts.find()
    ...,    "email" : 1 },...

Q2: То же самое касается этого include;

> db.posts.update({"permalink" : "jaiho"},{$inc:{"comments.0.num_likes":1}})
> db.posts.find()
    ..., "num_likes" : 1 },...
person Joachim Isaksson    schedule 30.06.2013

Если вы пытаетесь сделать это динамически в Node JS, должно работать следующее.

i = 0;
selector = {};
operator = {};
selector['comments.' + i + '.email'] = 1; // {'comments.0.num_likes' : 1}
operator['$inc'] = selector;  // {'$inc' : {'comments.0.num_likes' : 1} }
db.posts.update({'permalink' : 'xyz'}, operator);
person rohit hiresheddi    schedule 01.10.2013