2

您好,我有这样的 json 数据:

{ 
   "_id":ObjectId('5dfe907f80580559fedcc9b1'),
   "companyMail":"mail@gmail.com"
   "workers":[ 
      { 
         "name":name,
         "surName":surname,
         "mail":"mail2@gmail.com",
         "password":"password",
         "companyMail":"mail@gmail.com",
      }
   ]

}

我想从工人那里得到一个工人:

 { 
     "name":name,
     "surName":surname,
     "mail":"mail2@gmail.com",
     "password":"password",
     "companyMail":"mail@gmail.com",
  }

我正在写这个查询:

collection.findOne({
      'companyMail':"mail@gmail.com",
      'workers.mail':"mail2@gmail.com",

      });

但它给了我全部的数据。我只想得到我搜索的工人。我怎么能用 Mongo Dart 做到这一点。 https://pub.dev/packages/mongo_dart

4

3 回答 3

1

我找到了解决方案。我们应该使用聚合,但我们应该添加一些特定的查询来获得一个结果。在 dart mongo 中,我们可以使用 Filter 对象来添加。像那样:

            final pipeline = AggregationPipelineBuilder()
      .addStage(Match(where.eq('companyMail', companyMail).map['\$query']))
      .addStage(Match(where.eq('customers.mail', customerMail).map['\$query']))
      .addStage(Project({
        "_id": 0, //You can use as:'customer' instead of this keyword.
        "customers": Filter(input: '\$customers',cond: {'\$eq':["\$\$this.mail",customerMail]}).build(),
      }))
      .build();
  final result = await DbCollection(_db, 'Companies')
      .aggregateToStream(pipeline)
      .toList();
于 2019-12-26T09:58:47.373 回答
0

mongo-dart API 驱动程序非常糟糕并且没有很好的文档,而 mongo-node.js API 驱动程序非常好并且有很好的文档,所以最好用 node 做服务器端,例如在 node 中你的问题会解决一个行代码:

    collection.find(
    {
      'companyMail':"mail@gmail.com",
      'workers.mail':"mail2@gmail.com",
    }).project({
    '_id':0, 'workers':1
    });
于 2020-01-13T09:30:15.903 回答
-1

传递选项以仅投影工人字段

   db.company.findOne(
     {
        'companyMail':"mail@gmail.com",
        'workers.mail':"mail2@gmail.com",
      },
     {
         "workers":1,
         _id:0
     }
    );

在 mongo-dart 中,查看他们的 api,您可以使用聚合,如下所示

  final pipeline = AggregationPipelineBuilder()
    .addStage(Match(where.eq('companyMail','mail@gmail.com')))
    .addStage(Project({
                  '_id': 0,
                  "workers":1,
                })).build())

  final result =
     await DbCollection(db, 'company')
       .aggregateToStream(pipeline).toList();
  // result[0] should give you one worker
于 2019-12-23T11:07:40.090 回答