如何查找mongodb中各种数组的"Author"字段?
How to make a lookup of the "Author" field of various arrays in mongodb?
我的问题是我想为对象数组 "Reviews"、"Followers" 和 "Watching" 查找字段 "Author",但我没有这样做知道为什么它在其他数组中给我这个结果,该值重复 "Reviews" 数组中文档的相同次数。
.unwind({ path: '$reviews', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$reviews.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'reviews.author',
})
.unwind({ path: '$followers', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$followers.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'followers.author',
})
.unwind({ path: '$watching', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$watching.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'watching.author',
})
.group({
_id: '$_id',
data: {
$first: '$$ROOT',
},
reviews: {
$push: '$reviews',
},
followers: {
$push: '$followers',
},
watching: {
$push: '$watching',
},
})
This is the result when "Reviews" has documents:
"Followers / Watching" 数组在数据库中没有任何内容,但它以这种方式显示在这里,重复该值与评论中的文档数量相同,我不知道会发生什么。
And when all arrays are empty, this happens:
一直显示,不知道怎么修复
综上所述,"Reviews"、"Watching" 和 "Followers" 有一个 "Author" 字段,我想查找 watching 的作者字段,并且也适用于关注者和评论,但我有这些问题。我需要帮助。
Example: This is how it looks in the database:
非常感谢您。
$unwind
阶段为要展开的数组中的每个元素创建一个新文档。每个新文档都将包含文档中所有其他字段的副本。
如果原始文档看起来像
{
_id: "unique",
Array1:["A","B","C"],
Array2:["D","E","F"],
}
展开后"Array1",管道中将有3个文档:
[
{
_id: "unique",
Array1:"A",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"B",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"C",
Array2:["D","E","F"]
}
]
然后展开 "watchers" 将展开 each 观察者数组,以便您获得数组的笛卡尔积。 Playground
在您的例子中,原始文档有 2 个评论,但没有关注者和观察者,因此在管道的开头包含一个文档,类似于:
[
{
_id: "ObjectId",
data: "other data"
reviews: [{content:"review1", author:"ObjectId"},
{content:"review2", author:"ObjectId"}]
}
]
第一次展开后,您有 2 个文档:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"}
}
]
第一次查找将作者 ID 替换为每个文档的数据,然后第二次展开应用于每个文档。
由于该数组为空,因此查找 returns 一个空数组,并应用第三次展开。
在 $group
阶段之前,管道包含 2 个带有数组的文档:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"},
followers: {author: []},
watchers: {author: []}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"},
followers: {author:[]},
watchers: {author: []}
}
]
由于两个文档具有相同的 _id
,因此将它们组合在一起,最终结果包含第一个文档 "data"。
对于数组,当遇到每个文档时,相应字段的值被推送到数组中,导致每个数组有 2 个值。
我的问题是我想为对象数组 "Reviews"、"Followers" 和 "Watching" 查找字段 "Author",但我没有这样做知道为什么它在其他数组中给我这个结果,该值重复 "Reviews" 数组中文档的相同次数。
.unwind({ path: '$reviews', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$reviews.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'reviews.author',
})
.unwind({ path: '$followers', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$followers.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'followers.author',
})
.unwind({ path: '$watching', preserveNullAndEmptyArrays: true })
.lookup({
from: 'users',
let: { userId: '$watching.author' },
pipeline: [
{ $match: { $expr: { $eq: ['$_id', '$$userId'] } } },
{
$project: {
name: 1,
username: 1,
photo: 1,
rank: 1,
'premium.status': 1,
online: 1,
},
},
],
as: 'watching.author',
})
.group({
_id: '$_id',
data: {
$first: '$$ROOT',
},
reviews: {
$push: '$reviews',
},
followers: {
$push: '$followers',
},
watching: {
$push: '$watching',
},
})
This is the result when "Reviews" has documents:
"Followers / Watching" 数组在数据库中没有任何内容,但它以这种方式显示在这里,重复该值与评论中的文档数量相同,我不知道会发生什么。
And when all arrays are empty, this happens:
一直显示,不知道怎么修复
综上所述,"Reviews"、"Watching" 和 "Followers" 有一个 "Author" 字段,我想查找 watching 的作者字段,并且也适用于关注者和评论,但我有这些问题。我需要帮助。
Example: This is how it looks in the database:
非常感谢您。
$unwind
阶段为要展开的数组中的每个元素创建一个新文档。每个新文档都将包含文档中所有其他字段的副本。
如果原始文档看起来像
{
_id: "unique",
Array1:["A","B","C"],
Array2:["D","E","F"],
}
展开后"Array1",管道中将有3个文档:
[
{
_id: "unique",
Array1:"A",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"B",
Array2:["D","E","F"]
},{
_id: "unique",
Array1:"C",
Array2:["D","E","F"]
}
]
然后展开 "watchers" 将展开 each 观察者数组,以便您获得数组的笛卡尔积。 Playground
在您的例子中,原始文档有 2 个评论,但没有关注者和观察者,因此在管道的开头包含一个文档,类似于:
[
{
_id: "ObjectId",
data: "other data"
reviews: [{content:"review1", author:"ObjectId"},
{content:"review2", author:"ObjectId"}]
}
]
第一次展开后,您有 2 个文档:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"}
}
]
第一次查找将作者 ID 替换为每个文档的数据,然后第二次展开应用于每个文档。
由于该数组为空,因此查找 returns 一个空数组,并应用第三次展开。
在 $group
阶段之前,管道包含 2 个带有数组的文档:
[
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review1", author:"ObjectId"},
followers: {author: []},
watchers: {author: []}
},
{
_id: "ObjectId",
data: "other data"
reviews: {content:"review2", author:"ObjectId"},
followers: {author:[]},
watchers: {author: []}
}
]
由于两个文档具有相同的 _id
,因此将它们组合在一起,最终结果包含第一个文档 "data"。
对于数组,当遇到每个文档时,相应字段的值被推送到数组中,导致每个数组有 2 个值。