2017-01-18 15 views
1

私はMongoのCLIで次のコマンドを持っているが、私は何も結果を得ていないのです。それぞれの結果をコンソールに出力しますか?

db.files.find({ 
    state: 4, 
    created : { 
      '$gte': ISODate("2017-01-18T00:00:00.000Z"), 
      '$lte': ISODate("2017-01-19T00:00:00.000Z") 
    } 
}).forEach(function (o) { 
    db.users.find({"id": ObjectId(o.user)},{"username": 1}).pretty(); 
}); 

CLIでのI出力ユーザー名をどうすればよいですか?

db.users.find({},{'id':1, 'username':1}).pretty(); 
{ 
    "_id" : ObjectId("5489b6abe4b0e66fc6491c85"), 
    "username" : "[email protected]" 
} 

db.files.find({ }, {'id': 1, 'user': 1}).pretty(); 
{ "_id" : "--M17HJrR1m1svX6GZS-YQ", "user" : "56bfe199fe6cc47d0c2f8781" } 
{ "_id" : "--bnG8eJTfiYE08xjDphmQ", "user" : "56c477a9da1173ce065abfbf" } 
{ "_id" : "-0G2Q5fQQTCJhqEWjVkQYw", "user" : "57388a9b9ef0e2201245b265" } 

答えて

1

ファイルコレクション内のuserフィールドは文字列ではなく、ObjectIdであることを見て、あなたがusersコレクションを照会することができますObjectIdの配列にuser ID文字列をマップObjectId秒すなわちのリストを作成する必要がありますと。

たとえば、次の例では、両方のコレクションで2番目のクエリ引数を使用してdistinct()メソッドを使用して、参照を照会できる配列を生成します。最終結果はusernamesをコンソールに表示されます:

var userIds = db.files.distinct("user", { 
    "state": 4, 
    "created" : { 
     "$gte": ISODate("2017-01-18T00:00:00.000Z"), 
     "$lte": ISODate("2017-01-19T00:00:00.000Z") 
    } 
}).map(function(id) { return ObjectId(id); }); 
db.users.distinct("username", {"_id": { "$in": userIds } }).forEach(printjson); 

ユーザフィールドがObjectIdある場合、次のように集約フレームワークの$lookup演算子を使用する:

db.files.aggregate([ 
    { 
     "$match": { 
      "state": 4, 
      "created": { 
       "$gte": ISODate("2017-01-18T00:00:00.000Z"), 
       "$lte": ISODate("2017-01-19T00:00:00.000Z") 
      } 
     } 
    }, 
    { 
     "$lookup": { 
      "from": "users", 
      "localField": "user", 
      "foreignField": "_id", 
      "as": "userList" 
     } 
    }, 
    { 
     "$project": { 
      "user": { 
       "$arrayElemAt": ["$userList", 0] 
      } 
     } 
    }, 
    { 
     "$project": { 
      "username": "$user.username" 
     } 
    } 
]).map(function(doc) { return doc.username; }).forEach(printjson); 
+0

はユーザー名をリターンしていませんが、ユーザーIDは? – khinester

+0

私は質問 – khinester

+0

を更新しました。私はちょうど 'undefined'を得ます – khinester

0

ではありません"id"ではなく "_id"にする必要があります。

db.files.find({ 
    state: 4, 
    created : { 
      '$gte': ISODate("2017-01-18T00:00:00.000Z"), 
      '$lte': ISODate("2017-01-19T00:00:00.000Z") 
    } 
}).forEach(function (o) { 
    db.users.find({"_id": ObjectId(o.user)},{"username": 1}).pretty(); 
}); 

はまた、私はあなたがすべてのIDを取得し、P.S

var userIds = []; 
db.files.find({ 
     state: 4, 
     created : { 
       '$gte': ISODate("2017-01-18T00:00:00.000Z"), 
       '$lte': ISODate("2017-01-19T00:00:00.000Z") 
     } 
    },{user:1}).forEach(function (o) { 
     userIds.push(new ObjectId(o.user)); 
    }); 
    db.users.find({"_id": {$in : userIds},{"username": 1}).pretty(); 

すぎオペレータに呼び出すことができると思う - Chridamのアプローチは、これらのいずれかよりも有利です。

関連する問題