mongodb与/和/之间的区别

时间:2014-02-20 19:05:20

标签: mongodb nosql

我是mongo db的新手,并试图了解如何查询数据库。 我正在阅读此链接http://code.tutsplus.com/tutorials/getting-started-with-mongodb-part-1--net-22879

的教程

按照本教程,我创建了一个简单的数据库,如下所示,

db.nettuts.insert({
first: 'matthew',
last: 'setter',
dob: '21/04/1978',
gender: 'm',
hair_colour: 'brown',
occupation: 'developer',
nationality: 'australian'
});
    db.nettuts.insert({
first: 'james',
last: 'caan',
dob: '26/03/1940',
gender: 'm',
hair_colour: 'brown',
occupation: 'actor',
nationality: 'american'
});
db.nettuts.insert({
first: 'arnold',
last: 'schwarzenegger',
dob: '03/06/1925',
gender: 'm',
hair_colour: 'brown',
occupation: 'actor',
nationality: 'american'
});
db.nettuts.insert({
first: 'tony',
last: 'curtis',
dob: '21/04/1978',
gender: 'm',
hair_colour: 'brown',
occupation: 'developer',
nationality: 'american'
});
db.nettuts.insert({
first: 'jamie lee',
last: 'curtis',
dob: '22/11/1958',
gender: 'f',
hair_colour: 'brown',
occupation: 'actor',
nationality: 'american'
});
db.nettuts.insert({
first: 'michael',
last: 'caine',
dob: '14/03/1933',
gender: 'm',
hair_colour: 'brown',
occupation: 'actor',
nationality: 'english'
});
db.nettuts.insert({
first: 'judi',
last: 'dench',
dob: '09/12/1934',
gender: 'f',
hair_colour: 'white',
occupation: 'actress',
nationality: 'english'
});

并且正在尝试使用下面的查询

db.nettuts.find({gender: 'm'});

返回了所有男性演员。

当我尝试命令时

db.nettuts.find({gender: 'm', $or: [{nationality: 'english'}]});
它回来了。

> db.nettuts.find({gender: "m", $or: [{nationality: "english"}]});
{ "_id" : ObjectId("53064b7979d90b140e53df3e"), "first" : "michael", "last" : "caine",      "dob" : "14/03/1933", "gender" : "m", "hair_colour" : "brown", "occupation" : "actor", "nationality" : "english" }
>

当我尝试使用相同的命令时,这次使用“和”子句

db.nettuts.find({gender: 'm', $and: [{nationality: 'english'}]});

我获得了与使用$或

时相同的输出
> db.nettuts.find({gender: "m", $and: [{nationality: "english"}]});
{ "_id" : ObjectId("53064b7979d90b140e53df3e"), "first" : "michael", "last" : "caine", "dob" : "14/03/1933", "gender" : "m", "hair_colour" : "brown", "occupation" : "actor", "nationality" : "english" }
> 

所以给定这两个输出,这里的“or”子句和“and”子句之间的区别是什么。请帮我理解。

1 个答案:

答案 0 :(得分:3)

$or$and与只有一个条目的数组一起使用是没有意义的,因为两个运算符都应用于分配给它们的数组。它们不适用于match-object的任何其他部分。

当你想找到所有男性英语的演员时,你会这样做:

db.nettus.find({
     $or: [
          { "gender": "m"},
          { "nationality": "english"}
     ]   
});

要查找所有男性英语的演员,您甚至不需要$和 - 运算符:

db.nettus.find({
     "gender": "m",
     "nationality": "english"
});

很少有情况下你真的必须使用$和 - 运算符。唯一无法替代的情况是,您需要多次将相同的运算符应用于相同的字段。在此示例中,我们选择年龄can be divided乘以3和5的所有人。

db.people.find({
     $and: [
          { age: $mod [ 3, 0] },
          { age: $mod [ 5, 0] }
     ]
});