我们说我们有这些类型的文件:
var check_ins = [];
for (var i = 0; i < this.employees.length; i++) {
// let check = check_ins[i];
if (check_ins[i] === true) {
let alert = this.alertCtrl.create({
title: 'Sorry,',
subTitle: 'ur already checked in',
buttons: ['OK']
});
alert.present();
break;
} else if (check_ins[i] === false || check_ins[i] === undefined) {
let checkInTime = new TimeInModel(in_timing.date, emp_id, in_timing.time_in);
this.employeesService.pushTimeIn(checkInTime)
.subscribe(checkInTime => {
},
error => this.errorMessage = <any>error);
console.log("Successfully checked-in!");
check_ins[i].push(true);
break;
}
我的实际查询是:
{
"tags" : [
{
"fooObject" : {
"name" : "foo1"
},
"fooNumber" : 5,
"fooOther" : "foo"
},
{
"fooObject" : {
"name" : "foo2"
},
"fooNumber" : 4,
"fooOther" : "moo"
},
{
"fooObject" : {
"name" : "foo3"
},
"fooNumber" : 2,
"fooOther" : "goo"
}
]
}
所以我得到包含&#39; foo1&#39;和&#39; foo2&#39;。
我想通过添加fooNumber来扩展此查询。我的意思是,在db.foes.find({'tags.fooObject.name': { $all: ['foo1','foo2'] })
级别上成对匹配。我会传递带有标签的数组,但只指定tags
和fooObject
并获取包含这些标签的文档。
如果我要求
fooNumber
然后这个文件将匹配。 如果我要求
(foo1,5) and (foo2,4)
然后它就不匹配了。
答案 0 :(得分:2)
我认为你的意思是&#34;组合&#34; &#34;名称&#34;和&#34;价值&#34;在同一个数组元素中,整个数组包含&#34; both&#34;。因此,$elemMatch
需要$and
:
db.foes.find({
"$and": [
{ "tags": {
"$elemMatch": { "fooObject.name": "foo1", "fooNumber": 5 }
}},
{ "tags": {
"$elemMatch": { "fooObject.name": "foo2", "fooNumber": 4 }
}}
]
])
或者您甚至可以使用$all
db.foes.find({
"tags": { "$all": [
{ "$elemMatch": { "fooObject.name": "foo1", "fooNumber": 5 } },
{ "$elemMatch": { "fooObject.name": "foo2", "fooNumber": 4 } }
]}
})
这只会匹配&#34; both&#34;条件由&#34;标签&#34;中的数组元素满足。
$all
运算符有点缩短&#34;&#34;无论如何,$and
的形式。并且作为用于匹配&#34;对的运营商&#34;奇异数组元素的条件是$elemMatch
,那么配对只是自然的。