在我的项目Node和Mongo项目中,我使用mongoose进行建模。 我正在尝试对嵌套文档执行查找。 我有一个线程对象,其中一个“post”对象数组作为其属性之一。这个嵌套的“post”对象的一个属性是user_id,即发布的人。 我试图查找user_id(即 - localfield:thread.post.user_id,来自用户,foreignfield:_id),但是shell一直没有返回。
任何人都可以建议对我在下面尝试的内容进行修改:
db.threads.aggregate([
{ "$match": { "posts._id": ObjectId("abcdef") } },
{ "$sort": { "dateAdded": -1 } },
{ "$limit": 15 },
{ "$lookup": {"localField": "posts.user_id","from": "users","foreignField": "_id","as": "userinfo"} },
{ "$unwind": "$userinfo" },
{ "$project":{"dateAdded":1,"userinfo.name":1,"userinfo.username":1}}
]);
我的馆藏中的记录样本
db.threads.find({})返回...
{
"_id" : ObjectId("78910"),
"dateAdded" : ISODate("2017-08-18T16:44:23Z"),
"title" : "Thread Zero",
"posts" : [ {
"_id" : ObjectId("abcdef"),
"user_id" : ObjectId("12345"),
"postText" : "good evening",
"dateAdded" : "2017-8-18 17:44:34" } ],
"__v" : 0
}
db.users.find({})返回...
示例用户对象
{
"_id" : ObjectId("12345"), "name" : "James Free",
"name" : "Al Isonwunderland",
"password" : "$2a$10$ILpitvg1.o8X8GnaSaoG4ulnuNWrFTUfhQDA8CdihbHPjBrB8NaVm",
"username" : "muppet",
"__v" : 0
}
因此,我希望从线程上的每个帖子的“user”对象返回name属性。 我写的是尝试获取一个特定帖子的用户名称广告用户名,我会假设检索所有评论的用户名和名称是将$ match参数留空,允许它返回一个帖子列表使用用户的名称/用户名
有人可以证实吗?
答案 0 :(得分:0)
我将ObjectId替换为uuid属性,因为ObjectId很难处理(Mongo shell的#find()函数返回为ObjectId(" 5998a2a81762e90ce9f55d92"),然后从数据库中读取它只是字母数字(" 5998a2a81762e90ce9f55d92")返回,然后将该字母数字输入shell以测试命令始终返回null)
以下解决了我的问题,
db.threads.aggregate([
{$match: {uuid: 'de36dd72-238b-47b0-b363-3fbfa1f2743e'}},
{$unwind:"$posts"},
{$lookup: {
from: 'users',
localField: 'posts.user_uuid',
foreignField: 'uuid',
as: 'userInfo'}}
]);
这MongoDB $lookup on nested document 证明有用。 希望这能帮助其他人一路走来