简单模式,按最后关注者排序
Simple pattern , sort by last followers
我有 2 个 collection 个人资料和关注者。配置文件包含一些 ..profile 信息(特征、照片 ID 等),关注者包含被关注的配置文件 _ID 参考。
我在下面附上了这个 2 collection 的样本 。我们在 followers collection 中看到 bob(_id 1) 的最后一个 followers 分别是 4,2,3 prince,jhon , alice 。 _id 3 是 alice,这是最后插入的 .
我需要按照“先新后旧”的逻辑顺序显示 bob 每个最后关注者的所有个人资料信息(包含在个人资料 collection 中)。
我想它需要 2 个查询,但即使我没有找到解决方案/功能来做到这一点,这可能吗?如果您知道在 2 个查询中是否不可能,我完全愿意接受其他模式建议。
对于上面给出的例子,预期的结果(注意顺序是3、2、4)应该是:
{
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
{
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
{
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
配置文件 collection 示例:
db.profile.find()
{
"_id" : 1,
"name" : "bob",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7863635
}
{
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
{
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
{
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
关注者 collection 示例:
db.followers.find()
{
"_id" : 1,
"followers" : [4,2,3]
}
{
"_id" : 2,
"followers" : [8,2,3,11,39,653,]
}
{
"_id" : 3,
"followers" : [9,76,538,111,134]
}
var target = db.followers.find({_id: 1}).toArray();
var followers = target[0].followers.reverse();
由于您需要保留 followers
中参数的顺序 您将需要使用 mapReduce
作为 Neil Lunn 建议的 here
db.profile.mapReduce(
function () {
var order = inputs.indexOf(this._id);
emit( order, { doc: this } );
},
function() {},
{
"out": { "inline": 1 },
"query": { "_id": { "$in": followers } },
"scope": { "inputs": followers } ,
"finalize": function (key, value) {
return value.doc;
}
}
)
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
},
{
"_id" : 1,
"value" : {
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
},
{
"_id" : 2,
"value" : {
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
}
],
"timeMillis" : 1,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1
}
我有 2 个 collection 个人资料和关注者。配置文件包含一些 ..profile 信息(特征、照片 ID 等),关注者包含被关注的配置文件 _ID 参考。 我在下面附上了这个 2 collection 的样本 。我们在 followers collection 中看到 bob(_id 1) 的最后一个 followers 分别是 4,2,3 prince,jhon , alice 。 _id 3 是 alice,这是最后插入的 .
我需要按照“先新后旧”的逻辑顺序显示 bob 每个最后关注者的所有个人资料信息(包含在个人资料 collection 中)。 我想它需要 2 个查询,但即使我没有找到解决方案/功能来做到这一点,这可能吗?如果您知道在 2 个查询中是否不可能,我完全愿意接受其他模式建议。
对于上面给出的例子,预期的结果(注意顺序是3、2、4)应该是:
{
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
{
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
{
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
配置文件 collection 示例:
db.profile.find()
{
"_id" : 1,
"name" : "bob",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7863635
}
{
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
{
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
{
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
关注者 collection 示例:
db.followers.find()
{
"_id" : 1,
"followers" : [4,2,3]
}
{
"_id" : 2,
"followers" : [8,2,3,11,39,653,]
}
{
"_id" : 3,
"followers" : [9,76,538,111,134]
}
var target = db.followers.find({_id: 1}).toArray();
var followers = target[0].followers.reverse();
由于您需要保留 followers
中参数的顺序 您将需要使用 mapReduce
作为 Neil Lunn 建议的 here
db.profile.mapReduce(
function () {
var order = inputs.indexOf(this._id);
emit( order, { doc: this } );
},
function() {},
{
"out": { "inline": 1 },
"query": { "_id": { "$in": followers } },
"scope": { "inputs": followers } ,
"finalize": function (key, value) {
return value.doc;
}
}
)
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 3,
"name" : "alice",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7800098
}
},
{
"_id" : 1,
"value" : {
"_id" : 2,
"name" : "jhon",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 7111987
}
},
{
"_id" : 2,
"value" : {
"_id" : 4,
"name" : "prince",
"Region1" : "Alsace",
"code_postal" : 67240,
"ville" : "Oberhoffen-sur-Moder",
"photo_id" : 6535098
}
}
],
"timeMillis" : 1,
"counts" : {
"input" : 3,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1
}