gpt4 book ai didi

node.js - 如何查找如何在数组中查找子文档,其中每个子文档中的数组包含某个关键字?

转载 作者:太空宇宙 更新时间:2023-11-04 02:14:44 24 4
gpt4 key购买 nike

我正在使用 mongodb 创建 Twitter 克隆,并想要搜索其中包含特定主题标签的推文。我为我的数据库想出了以下文档结构 -

{
"_id" : ObjectId("56f88c038c297eb4048e5dff"),
"twitterHandle" : "abhayp",
"firstName" : "Abhay",
"lastName" : "Pendawale",
"emailID" : "abhayp@gmail.com",
"password" : "278a2c36eeebde495853b14e6e5525fd12074229",
"phoneNumber" : "12394872398",
"location" : "San Jose",
"birthYear" : 1992,
"birthMonth" : 0,
"birthDay" : 1,
"followers" : [
"abhayp",
"deepakp",
"john",
"madhuras",
"nupurs",
"vgalgali"
],
"following" : [
"abhayp",
"abhinavk",
"ankitac",
"anupd",
"arpits"
],
"tweets" : [
{
"tweet_id" : "3f0fe01f8231356f784d07111efdf9d8ead28133",
"tweet_text" : "This new twitter sounds good!",
"created_on" : ISODate("2016-03-13T01:47:37Z"),
"firstName" : "Abhay",
"lastName" : "Pendawale",
"twitterHandle" : "abhayp",
"tags" : [ ]
},
{
"tweet_id" : "4e57b6d7d6b47d69054f0be55c238e8038751d84",
"tweet_text" : "#CMPE273 Node.js is #awesome",
"created_on" : ISODate("2016-03-07T23:16:39Z"),
"firstName" : "Abhay",
"lastName" : "Pendawale",
"twitterHandle" : "abhayp",
"tags" : [
"awesome",
"CMPE273"
]
},
{
"tweet_id" : "e5facd5f37c44313d5be02ffe0a3ca7190affd6b",
"tweet_text" : "Getting an incredible welcome in #Pune #travel #adventure #film #india ",
"created_on" : ISODate("2016-03-07T23:37:27Z"),
"firstName" : "Abhay",
"lastName" : "Pendawale",
"twitterHandle" : "abhayp",
"tags" : [
"adventure",
"film",
"india",
"Pune",
"travel"
]
},
{
"tweet_id" : "f5a735c1f747732f3e04f6cb2c092ff44750c0fd",
"tweet_text" : "The D Day today!\n#TheDDay",
"created_on" : ISODate("2016-03-18T22:24:57Z"),
"firstName" : "Abhay",
"lastName" : "Pendawale",
"twitterHandle" : "abhayp",
"tags" : [ ]
}
]}

我想找出推文的 tags 数组中包含“Pune”的推文。我尝试执行以下命令db.users.find({ "tweets.tags": {$all: ["Pune"] }}, { tweets : 1 }).pretty();

但此命令会返回在其推文之一的标签中包含“Pune”条目的用户的所有推文。如何仅搜索 tags 数组中包含“Pune”条目的推文?

注意:我不想要发布#Pune 推文的用户,而是想要包含#Pune 的所有推文。重复标记的问题并不能解决这个问题。

运行以下查询 -

    db.users.aggregate([{
$match: {
'tweets.tags': 'Pune'
}
}, {
$project: {
tweets: {
$filter: {
input: '$tweets',
as: 'tweet',
cond: {
$eq: ['$$tweet.tags', 'Pune']
}
}
}
}
}]);

返回以下结果 -

{ "_id" : ObjectId("56f88c038c297eb4048e5df1"), "tweets" : [ ] }
{ "_id" : ObjectId("56f88c038c297eb4048e5dff"), "tweets" : [ ] }
{ "_id" : ObjectId("56f88c038c297eb4048e5e07"), "tweets" : [ ] }

这当然不是我想要的! :(

最佳答案

除了使用一些复杂的聚合阶段之外,我认为这是不可能的。

projection operator很接近,但只返回第一个匹配项。

我的建议是将推文放在一个单独的集合中,这样浏览起来会更方便,而且可能更具可扩展性。您已经在其中复制了相关用户信息,因此无需更改其内容。

关于node.js - 如何查找如何在数组中查找子文档,其中每个子文档中的数组包含某个关键字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36255678/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com