基于id获取电影的mongodb查询出错
这是我在mongodb中的数据。 因为我是mongodb的新手,所以我想知道如何通过查询获取具有特定id的电影。 我尝试的问题是。我需要根据id获取电影,以便将其从数据库中删除基于id获取电影的mongodb查询出错,mongodb,Mongodb,这是我在mongodb中的数据。 因为我是mongodb的新手,所以我想知道如何通过查询获取具有特定id的电影。 我尝试的问题是。我需要根据id获取电影,以便将其从数据库中删除 > db.movmodels.findOne() { "_id" : ObjectId("55320b0e0e9e0d9d0540593c"), "username" : "punk", "favMovies" : [ { "alternate_ids
> db.movmodels.findOne()
{
"_id" : ObjectId("55320b0e0e9e0d9d0540593c"),
"username" : "punk",
"favMovies" : [
{
"alternate_ids" : {
"imdb" : "0137523"
},
"abridged_cast" : [
{
"characters" : [
"Tyler"
],
"id" : "162652627",
"name" : "Brad Pitt"
},
{
"characters" : [
"Narrator"
],
"id" : "162660884",
"name" : "Edward Norton"
},
{
"characters" : [
"Robert"
],
"id" : "162676383",
"name" : "Meat Loaf"
},
{
"characters" : [
"Angel Face"
],
"id" : "162653925",
"name" : "Jared Leto"
},
{
"characters" : [
"Boss"
],
"id" : "770706064",
"name" : "Zach Grenier"
}
],
"synopsis" : "",
"ratings" : {
"audience_score" : 96,
"audience_rating" : "Upright",
"critics_score" : 80,
"critics_rating" : "Certified Fresh"
},
"release_dates" : {
"dvd" : "2000-06-06",
"theater" : "1999-10-15"
},
"critics_consensus" : "",
"runtime" : 139,
"mpaa_rating" : "R",
"year" : 1999,
"title" : "Fight Club",
**"id" : "13153"**
}
],
"__v" : 0
}
但这给了我错误
db.movmodels.findOne({username:"punk"},{favMovies:{id:13153}})
如果要在“favMovies”数组中查找另一个id为13153的电影,请按如下所示编写查询:
2015-04-18T05:41:26.221-0400 E QUERY Error: error: {
"$err" : "Can't canonicalize query: BadValue ported projection option: favMovies: { id: 13153.0 }",
"code" : 17287
}
at Error (<anonymous>)
at DBQuery.next (src/mongo/shell/query.js:259:15)
at DBCollection.findOne (src/mongo/shell/collection.js:188:22)
at (shell):1:14 at src/mongo/shell/query.js:259
如果要查找id为55320B0E0E9E0D9D0540593C的电影,请编写以下查询:
db.movmodels.findOne({username:"punk",'favMovies.id':13153})
您的查询有几个问题: 第二个参数是投影,而不是查询的一部分。您需要为查询提供一个具有两个属性的文档:{username:punk,favMovies:{…} 但是,您也不想比较整个子文档favMovies,但只想匹配它的一个属性,即id,它需要使用点运算符“{username:punk,favMovies.id:13153}”来“接触对象” 然而,这可能还不起作用,因为13153与13153不同,后者是字符串,而前者是JSON中的数字
db.movmodels.findOne({username:"punk",'_id':ObjectId("55320b0e0e9e0d9d0540593c")})
但是,请记住,这将为名为朋克的用户找到整个文档。我不确定您的数据结构到底应该是什么样子,但似乎您必须从用户那里获取电影。一般来说,我会说你在用户中嵌入了太多的数据,但如果不知道确切的用例,就很难说出来。给你:
如果您只想获得第一个拥有此fav电影的用户:
db.movmodels.findOne({username:"punk", "favMovies.id" : "13153"})
如果你想知道用户是否喜欢这部电影
db.movmodels.findOne({"favMovies.id": 13153});
findOne中的第二个参数仅用于返回特定字段。您还可以使用$elemMatch查询运算符,以免与之混淆
db.movmodels.findOne({"favMovies.id": 13153, username:"punk"});
`db.movmodels.findOne{username:punk},{'favMovies.id':13153}{{u-id:objectid55320b0e0e9e0d9d054593c,favMovies:[{id:13153}}}我正在获取数据,但我想用它从我在nodejs服务器应用程序中为其编写代码的mongodb中删除数据。删除'/favMovies/:user/:movid',functionreq,res{var u=req.params.user;var mid=req.params.movid;MovModel.findOne{username:u},{'favMovies.id':mid},函数err,doc{doc.remove;MovModel.findfunction err,数据{ res.jsondata;};};};如果您是从查询字符串获取参数,例如使用req.params.user,则应将其转换为整数:var id=parseIntmid;然后在查询中使用id,mid。更改查询中约束的顺序可能会影响性能。假设有许多用户喜欢某一特定电影,但用户名是唯一的。那么,即使vMovies.id已被索引,第一个查询条件仍保留数千个必须在索引中找到的匹配项,然后才能按假定唯一的用户名进行筛选。作为一般规则,请尝试按选择性降序排列查询参数。感谢@mnemosyn的响应和澄清。我们已经在使用索引并改进了索引更多信息。我没有听清楚你的最后一行:尝试按选择性降序排列查询参数。请你详细说明一下。我认为这意味着你应该首先放置选择性更强的查询参数,因此在下一个查询参数中,你将在更少的结果之间搜索。是的,你是对的@rubenrodriguezfernandez.Tha谢谢你。
db.movmodels.find({username:"punk"},{favMovies:{$elemMatch:{id:"13153"}}});