使用对象属性查询$ all

时间:2017-06-13 08:48:48

标签: mongodb mongodb-query

我们说我们有这些类型的文件:

              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'] }) 级别上成对匹配。我会传递带有标签的数组,但只指定tagsfooObject并获取包含这些标签的文档。

如果我要求

fooNumber

然后这个文件将匹配。 如果我要求

(foo1,5) and (foo2,4)
然后它就不匹配了。

1 个答案:

答案 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,那么配对只是自然的。