MongoDB - 在嵌入式文档中发现奇怪的行为

时间:2014-02-11 23:49:53

标签: mongodb mongodb-query

我在test数据库中有这个集合。

[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 个答案:

答案 0 :(得分:1)

非常有趣的情况,说实话。但是,我认为有 获得所需的更有效的命令。

我已按如下方式解决了您的问题。

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

,结果如下:

enter image description here

第一个OP查询工作的原因和第二个OP查询不是因为
在第一种情况下,有文件符合被查询的确切形式 第二个OP查询使用修饰符,因此需要使用$ elemMatch包装。

可以在此处找到MongoDB官方网站的更多信息:
http://docs.mongodb.org/manual/reference/operator/projection/elemMatch/

希望这有帮助。