是否可以通过子字段对象值查询MongoDB?

时间:2013-03-22 12:45:31

标签: mongodb

我有这样的文件:

db.planet.insert({ 
    name: 'Earth',
    stuff: {
        'grass': 'green',
        'sky': 'blue',
        'sea': 'blue'
    }
})
db.planet.insert({ 
    name: 'Mars',
    stuff: {
        'dust': 'red',
        'sky': 'yellow'
    }
})

我想找到至少有一些blue 东西的所有行星(在这种情况下只有地球)。我怎么能这样做?

Catch :我尝试使用 stuff stuff: [ { k: 'grass', v: 'green'},... ])的数组(而不是对象)来解决这个问题,但我还需要能够更新( upsert 准确地说)某些东西的值。例如,我必须能够这样做:

db.planet.update({ name: 'Mars' }, {
    '$set': { 
        'stuff.canals': 'brown', 
        'stuff.dust': 'reddish' 
    } 
})

那么,我怎样才能找到带有blue的行星呢? :)

1 个答案:

答案 0 :(得分:2)

使用$或运算符。 $或operator值应该是一个数组,该数组包含至少必须为1的条件。

在您的情况下,根据您提到的字段名称:

 db.planet.find($or:[
   {"stuff.sky":"blue"},
   {"stuff.grass":"blue"},
   {"stuff.sea":"blue"},
   {"stuff.dust":"blue"},
   {"stuff.canals":"blue")
 ])

http://docs.mongodb.org/manual/reference/operator/or/
由于您要查询的字段数量相当多,您可能希望在某处保留所有这些字段名称的数组,以便以编程方式生成$或数组。

我认为没有办法在不事先知道字段名称的情况下进行查询。请参阅mongodb query without field name