我有一个如下的样本集。
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({IDS:{$ LT:4,$ GT:3}});
我预计它不会返回任何文件,因为没有值为< 4和> 3的文件作为其中一个ID'值。
但它返回了2份文件。
{ "_id" : ObjectId("56c804b9db13da086828b415"), "name" : "n", "ids" : [ 3, 4, 5 ], "department" : "A" }
{ "_id" : ObjectId("56c804b9db13da086828b417"), "name" : "h", "ids" : [ 1, 3, 4 ], "department" : "B" }
这是如何运作的?
答案 0 :(得分:1)
它的工作方式是一个元素满足第一个条件而另一个元素满足第二个条件(当然一个元素可以满足两个条件),只要满足所有条件,这样就会返回文档。 / p>
具体做法是:
找到 NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDate *currentDate = [NSDate date];
NSDateComponents *comps = [[NSDateComponents alloc] init];
NSDateComponents *compsII = [[NSDateComponents alloc] init];
[comps setYear:-14];
NSDate *maxDate = [calendar dateByAddingComponents:comps toDate:currentDate options:0];
[compsII setYear:1960];
NSDate *minDate = [[NSCalendar currentCalendar] dateFromComponents:compsII];
datePicker =[[UIDatePicker alloc]initWithFrame:CGRectMake(0, 400, self.view.frame.size.width, 200)];
datePicker.datePickerMode = UIDatePickerModeDate;
datePicker.hidden=NO;
datePicker.maximumDate = maxDate;
datePicker.minimumDate = minDate;
是因为元素3小于4而元素4和5大于3 - 因此从这两个元素中满足了两个条件
[3, 4, 5]
因为元素1和3小于4而元素4大于3
请参阅名为&#34的部分中的https://docs.mongodb.org/v3.0/tutorial/query-documents/#arrays;元素组合满足标准"
现在,如果你想找到文件,至少有一个元素满足所有这样的条件,你应该使用[1, 3, 4]
。
在您的示例中:
$elemMatch
答案 1 :(得分:1)
如果字段包含数组且查询具有多个条件运算符,则如果单个数组元素满足条件或数组元素的组合满足条件,则整个字段将匹配。
Here您会找到更多说明
使用$ elemMatch仅对数组进行严格比较。所以您可以使用如下查询:
db.collection.find({ ids: { $elemMatch:{ $lt:4, $gt:3 } } })