2014-02-11 1 views
0

У меня есть эта коллекция в моей базе данных test.MongoDB - странное поведение поиска по встроенному документу

[test] 2014-02-11 18:45:48.338 >>> db.blog.posts.find(); 
{ 
     "_id" : ObjectId("52ee29bdb8eb94049427886a"), 
     "comments" : [ 
       { 
         "author" : "Jane", 
         "comment" : "yes, yes, it is", 
         "votes" : 5 
       } 
     ], 
     "content" : "This is a post", 
     "id" : 5 
} 
{ 
     "_id" : ObjectId("52f95c5bd1fe9c171fe4344b"), 
     "comments" : [ 
       { 
         "author" : "Jane", 
         "comment" : "yes, yes, it is", 
         "votes" : 5 
       }, 
       { 
         "author" : "Nick", 
         "comment" : "test", 
         "votes" : 10 
       }, 
       { 
         "author" : "John", 
         "comment" : "new one", 
         "votes" : 4 
       } 
     ], 
     "content" : "This is a post", 
     "id" : 5 
} 

Когда я запускаю этот запрос: найти

[test] 2014-02-11 18:45:50.318 >>> db.blog.posts.find({ "comments" : {author : "Jane", comment: "yes, yes, it is", votes: 5}}); 

я получаю как документы обратно.

Но если я запускаю этот запрос найти

[test] 2014-02-11 18:46:18.428 >>> db.blog.posts.find({ "comments" : {author : "Jane", comment: "yes, yes, it is", votes: {$gte : 5}}}); 

я не получаю документы обратно.

Почему? Как получилось, что == 5 возвращает результаты, но> = 5 ничего не возвращает.

ответ

1

Очень интересный случай, если быть честным. Но, я думаю, там
- более эффективные команды, чтобы получить то, что вам нужно.

Я решил вашу проблему следующим образом.

db.posts.find({ 
"comments": { 
    "$elemMatch": { 
     author : "Jane", 
     comment: "yes, yes, it is", 
     votes: {"$gte" : 5} 
    } 
    } 
}); 

и результат выглядит следующим образом:

enter image description here

Причина первый запрос OP работает, а второй О.П. запрос не потому, что
в первом случае есть документы которые отвечают точно заданной форме.
Второй запрос OP использует модификатор, поэтому необходимо обернуть с помощью $ elemMatch.

Более подробная информации на официальном сайте MongoDB можно найти здесь:
http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

Надеется, что это помогает.

+1

Очень хорошо. Возможно, это поможет объяснить причину, по которой первый запрос работал, а второй - нет, потому что в первом случае были s документы, которые удовлетворяли запрошенной * точной * форме. Второй случай использует модификатор * *, поэтому необходимо обернуть с помощью ** $ elemMatch ** –

+0

@NeilLunn Спасибо и спасибо quy, который тоже ответил. –