从符合条件 Mongodb Dart 的文档中获取子文档
Get a subdocument from document with criteria Mongodb Dart
你好,我有 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
传递选项以仅投影 workers 字段
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
我找到了解决方案。我们应该使用聚合,但我们应该添加一些特定的查询来获得一个结果。在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();
mongo-dart API 驱动程序非常糟糕,没有好的文档,而 mongo-node.js API 驱动程序非常好并且有非常好的文档,所以最好用节点做服务器端,例如在节点中你的问题将通过一行代码解决:
collection.find(
{
'companyMail':"mail@gmail.com",
'workers.mail':"mail2@gmail.com",
}).project({
'_id':0, 'workers':1
});
你好,我有 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
传递选项以仅投影 workers 字段
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
我找到了解决方案。我们应该使用聚合,但我们应该添加一些特定的查询来获得一个结果。在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();
mongo-dart API 驱动程序非常糟糕,没有好的文档,而 mongo-node.js API 驱动程序非常好并且有非常好的文档,所以最好用节点做服务器端,例如在节点中你的问题将通过一行代码解决:
collection.find(
{
'companyMail':"mail@gmail.com",
'workers.mail':"mail2@gmail.com",
}).project({
'_id':0, 'workers':1
});