Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在$lookup之后获取作为元素数组的值_Mongodb_Mongodb Query_Aggregation Framework - Fatal编程技术网

Mongodb 在$lookup之后获取作为元素数组的值

Mongodb 在$lookup之后获取作为元素数组的值,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,对于MongoDB,当使用$lookup查询多个集合时,是否可以为$lookup中返回的字段获取仅值列表 我不想要的是完整对象及其所有键/值的列表 数据: failover_tool:PRIMARY> db.foo.find().pretty() { "_id" : ObjectId("5ce72e415267960532b8df09"), "name" : "foo1", "desc" : "first foo" } { "_id" : ObjectId(

对于MongoDB,当使用
$lookup
查询多个集合时,是否可以为
$lookup
中返回的字段获取仅值列表

我不想要的是完整对象及其所有键/值的列表

数据

failover_tool:PRIMARY> db.foo.find().pretty()
{
    "_id" : ObjectId("5ce72e415267960532b8df09"),
    "name" : "foo1",
    "desc" : "first foo"
}
{
    "_id" : ObjectId("5ce72e4a5267960532b8df0a"),
    "name" : "foo2",
    "desc" : "second foo"
}
failover_tool:PRIMARY> db.bar.find().pretty()
{
    "_id" : ObjectId("5ce72e0c5267960532b8df06"),
    "name" : "bar1",
    "foo" : "foo1"
}
{
    "_id" : ObjectId("5ce72e165267960532b8df07"),
    "name" : "bar2",
    "foo" : "foo1"
}
{
    "_id" : ObjectId("5ce72e1d5267960532b8df08"),
    "name" : "bar3",
    "foo" : "foo2"
}
所需的查询输出

{
    "_id" : ObjectId("5ce72e415267960532b8df09"),
    "name" : "foo1",
    "desc" : "first foo",
    "bars" : ["bar1", "bar2"]
},
{
    "_id" : ObjectId("5ce72e4a5267960532b8df0a"),
    "name" : "foo2",
    "desc" : "second foo",
    "bars" : ["bar3"]
}
最近的

{
    "_id" : ObjectId("5ce72e415267960532b8df09"),
    "name" : "foo1",
    "desc" : "first foo",
    "bars" : ["bar1", "bar2"]
},
{
    "_id" : ObjectId("5ce72e4a5267960532b8df0a"),
    "name" : "foo2",
    "desc" : "second foo",
    "bars" : ["bar3"]
}
这个查询看起来就快到了,但它在
栏中返回的数据太多了
字段:

db.foo.aggregate({
    $lookup: {
        from:"bar",
        localField:"name",
        foreignField: "foo",
        as:"bars"
    }
}).pretty()

希望以下查询有帮助:

db.foo.aggregate([{
  $lookup: {
    from:"bar",
    localField:"name",
    foreignField: "foo",
    as:"bars"
  }
 },
 {$unwind : '$bars'},
 {
   $group : {
    _id : {
        _id : '$_id',
        name : '$name',
        desc : '$desc'
    },
    bars : { $push : '$bars.name'}
   }
 },
 {
   $project : {
     _id : '$_id._id',
     name : '$_id.name',
     desc : '$_id.desc',
     bars : '$bars'
  }
 }
]).pretty()
输出:

{
 "_id" : ObjectId("5ce72e4a5267960532b8df0a"),
 "name" : "foo2",
 "desc" : "second foo",
 "bars" : [
    "bar3"
 ]
}
{
 "_id" : ObjectId("5ce72e415267960532b8df09"),
 "name" : "foo1",
 "desc" : "first foo",
 "bars" : [
    "bar1",
    "bar2"
 ]
}

只需在
名称
字段中使用
.dot
符号即可

db.foo.aggregate([
  { "$lookup": {
    "from": "bar",
    "localField": "name",
    "foreignField": "foo",
    "as": "bars"
  }},
  { "$addFields": { "bars": "$bars.name" }}
])