2017-08-19 21 views
-1

私のプロジェクトのノードとMongoプロジェクトで、私は私のモデリングにmongooseを使用しています。 入れ子になっているドキュメントに対してルックアップを実行しようとしています。 私はスレッドオブジェクトを持っていて、プロパティの1つとして "post"オブジェクトの配列を持っています。このネストされた "投稿"オブジェクトのプロパティの1つは、投稿したユーザーのuser_idです。 私はuser_id(つまり、 - localfield:thread.post.user_id、users、foreignfield:_id)を検索しようとしましたが、シェルは何も返しません。

誰もが、私は以下しようとしたものに改正勧めできます:

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

フィールド 'user_id ':" 12345 "'は 'ObjectId'を含む' _id'とマッチさせようとしている "文字列"を含んでいます。他のコレクションで参照しているものと同じ 'ObjectId'値を含むように' user_id'のデータを修正する必要があります。また、配列内のソースを使用するにはMongoDB 3.4が必要です。 –

+0

謝罪、誤字、threads.postsのuser_idは、 "12345"ではなくObjectId( "12345")を読みます。 – OisinFoley

+0

いいえ、それはありません。 'ObjectId(" 12345 ")'これは 'ObjectId'のための有効な値ではないので、あなたの質問に役立つようにするには、**実際のデータ**を生成する必要があり、抽象または難読化は必要ありません。ここに実際のデータを投稿してあなたのシステムをハッキングしてください。したがって、実際のデータを再現できる方法で投稿してください。 [最小限の完全かつ検証可能なサンプルを作成する方法](https://stackoverflow.com/help/mcve)を参照してください。しかし、タイプの不一致や誤ったコレクション名が最も確実です。それらは結果の唯一の2つの可能な原因です。もちろん、MongoDBのバージョンです。 –

答えて

0

私がのObjectIdがのObjectId(「5998a2a81762e90ce9f55d92」)として(モンゴシェルの.find()関数が返すに対処する散らかっているように、データベースからの読み取り時に、それは単に、英数字(「5998a2a81762e90ce9f55d92」のUUIDプロパティのObjectIdをスワップアウト)が復帰してからコマンドをテストするためにシェルにその英数字を入力すると、常に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 は有用であることが証明。 これは他の誰かが道に沿って助けてくれることを願っています

関連する問題