集合:
{
"_id" : ObjectId("57506d74c469888f0d631be6"),
"name" : "mycollection",
"details" : [
{
"date" : "25/03/2020",
"number" : "A",
"active" : false
}
},
{
"_id" : ObjectId("57506d74c469888f0d631usi"),
"name" : "newcollection",
"details" : [
{
"date" : "30/03/2020",
"number" : "C",
"active" : false
}
},
{
"_id" : ObjectId("57506d74c4633388f0d631usi"),
"name" : "mycollection",
"details" : [
{
"date" : "31/03/2020",
"number" : "C",
"active" : false
}
},
}根据details字段中的活动状态获取值的查找查询。
我试过:
db.collection.find(
{"name": "mycollection", "details": {"active": False}})预期结果:在每个集合中的details字段下,我需要活动为false的集合。这里应该显示记录id ObjectId("57506d74c469888f0d631be6")和ObjectId("57506d74c4633388f0d631usi")。
发布于 2020-05-27 15:50:19
如果details数组可能有一些具有active = true的对象,一些对象= false,而且您只需要获得具有active =false的对象,那么我们可以使用聚合管道中的$filter来过滤细节数组
你的疑问也许是这样的
db.collection.aggregate([
{
$match: {
name: "mycollection",
"details.active": false
}
},
{
$project: {
name: 1,
details: {
$filter: {
input: "$details",
as: "elem",
cond: {
$eq: ["$$elem.active", false]
}
}
}
}
}
])你可以在这里测试一下
希望它能帮上忙
发布于 2020-05-27 14:38:12
文档包含关于这种类型的查询的一节:https://docs.mongodb.com/manual/tutorial/query-array-of-documents/
您的查询不起作用,因为这种语法要求数组包含确切的对象,但是数组中的文档包含额外的字段,因此没有匹配。
本例的查询是db.collection.find({"name": "mycollection", "details.active": False})。
注意:这将返回数组包含带有active==false的对象的所有文档,但是它不会过滤实际的数组来删除active=true的任何元素。
发布于 2020-05-27 15:10:01
对mongodb或robomongo的查询与在您的示例中find()可能工作相同,但我选择了可以筛选值的聚合。
示例查询:
db.getCollection('collection').aggregate([{$match: {'details.active': {$ne: true},"name":"mycollection"}}]) 很简单。但请确认并回复。
https://stackoverflow.com/questions/62045507
复制相似问题