2014-01-16 2 views
0

У меня есть коллекция под названием StudentCollection с двумя документами, приведенными ниже,MongoDB и сравнение Сбой

> db.studentCollection.find().pretty() 
{ 
    "_id" : ObjectId("52d7c0c744b4dd77efe93df7"), 
    "regno" : 101, 
    "name" : "Ajeesh", 
    "gender" : "Male", 
    "docs" : [ 
      "voterid", 
      "passport", 
      "drivinglic" 
    ] 
} 
{ 
    "_id" : ObjectId("52d7c6a144b4dd77efe93df8"), 
    "regno" : 102, 
    "name" : "Sathish", 
    "gender" : "Male", 
    "dob" : ISODate("2013-12-09T21:05:00Z") 
} 

Почему ниже запрос возвращает документ, если он не отвечает критериям, которые я дал в команде поиска. Я знаю, что это плохой & глупый запрос для И сравнение. Я пробовал это с MySQL, и он не возвращает ничего, как ожидалось, но почему NOSQL делает проблему. Надеюсь, он рассматривает последнее поле для сравнения.

> db.studentCollection.find({regno:101,regno:102}).pretty() 
{ 
    "_id" : ObjectId("52d7c6a144b4dd77efe93df8"), 
    "regno" : 102, 
    "name" : "Sathish", 
    "gender" : "Male", 
    "dob" : ISODate("2013-12-09T21:05:00Z") 
} 

Может ли кто-нибудь объяснить, почему Mongodb работает таким образом?

+0

Как указал Кеннет, причиной, по которой вы получаете только один результат, является то, что объект JavaScript, созданный для вашего запроса, может иметь только одно значение для regno. Вы можете продемонстрировать это, введя в оболочку mongo JavaScript: a = {regno: 10, regno2: 20}, а затем введите b = {regno: 10, regno: 20} и увидите разницу. – nachbar

ответ

4

MongoDB использует JSON/BSON и имена должны быть уникальными (http://www.ietf.org/rfc/rfc4627.txt @ 2.2.) Найдено в другом сообщении How to generate a JSON object dynamically with duplicate keys?. Я предполагаю, что значение для «regno» будет заменено на «102» в вашем случае.

Если то, что вы хотите запрос OR, попробуйте следующее:

db.studentCollection.find ({ $or : [ { "regno" : "101" }, {"regno":"102"} ] }); 

или даже лучше, используйте $ в:

db.studentCollection.find ({ "regno" : { $in: ["101", "102"] } }); 

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

Редактировать: Typo!

0

MongoDB преобразует ваш запрос в документ Javascript. Поскольку вы ничего не указали для $ и условия в своем документе, ваше предложение запроса перезаписывается последним значением, которое является «regno»: «102». Следовательно, вы получаете последний документ в качестве результата.

Если вы хотите использовать $ и вы можете использовать любой из следующих:

db.studentCollection.find ({$ и: [{Regno: "102"}, {Regno: "101" }]});

db.studentCollection.find ({regno: {$ gte: "101", $ lte: "102"}});

Смежные вопросы