Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.4k views
in Technique[技术] by (71.8m points)

mongodb - Get values as array of elements after $lookup

For MongoDB, when using $lookup to query more than one collection, is it possible to get a values-only list for a field returned in the $lookup?

What I don't want is a list of the full object with all its key/values.

Data:

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"
}

Desired Query Output

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

Closest

This query seems like it's almost there, but it returns too much data in the bars field:

db.foo.aggregate({
    $lookup: {
        from:"bar",
        localField:"name",
        foreignField: "foo",
        as:"bars"
    }
}).pretty()
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Just use .dot notation with the name field

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

MongoPlayground


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...