2016-02-20 1 views
0

У меня есть образец коллекции, как показано ниже.Mongo Операции сравнения

db.sample.find();

{ "_id" : ObjectId("56c804b9db13da086828b414"), "name" : "h", "ids" : [ 1, 2, 3 ], "department" : "A" } 
{ "_id" : ObjectId("56c804b9db13da086828b415"), "name" : "n", "ids" : [ 3, 4, 5 ], "department" : "A" } 
{ "_id" : ObjectId("56c804b9db13da086828b416"), "name" : "m", "ids" : [ 4, 5, 6 ], "department" : "A" } 
{ "_id" : ObjectId("56c804b9db13da086828b417"), "name" : "h", "ids" : [ 1, 3, 4 ], "department" : "B" } 
{ "_id" : ObjectId("56c808d2db13da086828b418"), "name" : "t", "fullname" : "t", "ids" : [ 5, 6, 7 ] } 

Когда я запрос

db.sample.find ({идентификаторы: {$ л: 4, $ Gt: 3}});

Я ожидал, что он не вернет документы, поскольку нет документов со значением < 4 и> 3 как одно из значений идентификаторов.

Но он вернул 2 документа.

{ "_id" : ObjectId("56c804b9db13da086828b415"), "name" : "n", "ids" : [ 3, 4, 5 ], "department" : "A" } 
{ "_id" : ObjectId("56c804b9db13da086828b417"), "name" : "h", "ids" : [ 1, 3, 4 ], "department" : "B" } 

Как это работает?

ответ

1

Если поле содержит массив и запрос имеет несколько условных операторов, поле в целом будет соответствовать, если ни один элемент массива соответствует условиям или сочетание элементов массива удовлетворяет условиям.

Here вы найдете подробное описание

Использование $ elemMatch сделать строгие сравнения только для массива. Таким образом, вы можете использовать запрос:

db.collection.find({ ids: { $elemMatch:{ $lt:4, $gt:3 } } }) 
1

Способ, которым он работает, состоит в том, что один элемент удовлетворяет первому условию, а другой элемент удовлетворяет второму условию (конечно, один элемент может удовлетворять обоим условиям), если все условия выполнены таким образом, документ будет возвращен.

В частности:

[3, 4, 5] найден, потому что элемент 3 меньше, чем 4 и элементом 4 и 5 больше, чем 3 - так оба ваших условий удовлетворяются из этих двух элементов

[1, 3, 4] найден потому элемент 1 и 3 меньше, чем 4, и элемент 4 больше, чем 3

см https://docs.mongodb.org/v3.0/tutorial/query-documents/#arrays в разделе под названием «комбинация элементов удовлетворяет критериям»

Теперь, если вы хотите найти документы , что хотя бы один элемент удовлетворяет всем таким условиям, вы должны использовать $elemMatch.

В вашем примере это будет:

db.sample.find({ ids: { $elemMatch: { $lt: 4, $gt: 3 } } }) 
Смежные вопросы