MongoDB,如何使用文档作为在数组中搜索文档的最小单位?

时间:2015-06-16 04:58:07

标签: mongodb

对不起标题,但我真的不知道如何说清楚。但是我可以给你看。

这里我插入了两个文件

> db.test.find().pretty()
{
    "_id" : ObjectId("557faa461ec825d473b21422"),
    "c" : [
        {
            "a" : 3,
            "b" : 7
        }
    ]
}
{
    "_id" : ObjectId("557faa4c1ec825d473b21423"),
    "c" : [
        {
            "a" : 1,
            "b" : 3
        },
        {
            "a" : 5,
            "b" : 9
        }
    ]
}
> 

我只想选择第一个文件,其值大于' a'小于'',如' 4'。

但是当我搜索时,我无法得到我想要的结果

> db.test.find({'c.a': {$lte: 4}, 'c.b': {$gte: 4}})
{ "_id" : ObjectId("557faa461ec825d473b21422"), "c" : [ { "a" : 3, "b" : 7 } ] }
{ "_id" : ObjectId("557faa4c1ec825d473b21423"), "c" : [ { "a" : 1, "b" : 3 }, { "a" : 5, "b" : 9 } ] }
> 

因为' 4'大于' a" :1'小于" b" :9'在第二个文档中,即使它不在数组中的同一个文档中,也选择了第二个文档。

但我只想选择第一个。

我发现了这个http://docs.mongodb.org/manual/reference/operator/query/elemMatch/#op._S_elemMatch,但似乎这个例子不适合我的情况。

2 个答案:

答案 0 :(得分:0)

使用$elemMatch,如下所示:

db.test.find({"c":{"$elemMatch":{"a":{"$lte":4},"b":{"$gte":4}}}})

或者

db.test.find({"c":{"$elemMatch":{"a":{"$lte":4},"b":{"$gte":4}}}},{"c.$":1})

答案 1 :(得分:0)

你想要

db.test.findOne({ c: {$elemMatch: {a: {$lte: 4}, b: {$gte: 4} } } })

根据您的查询,您正在搜索“c'”中包含对象的文档。具有键的数组' a'值< = 4,键' b'值> gt; = 4.

第二条记录是return,因为c [0] .a是< = 4,而c [1] .b是> = 4。

由于您指定只想选择第一个文档,因此您需要执行findOne()而不是find()。