基于id获取电影的mongodb查询出错

基于id获取电影的mongodb查询出错,mongodb,Mongodb,这是我在mongodb中的数据。 因为我是mongodb的新手,所以我想知道如何通过查询获取具有特定id的电影。 我尝试的问题是。我需要根据id获取电影,以便将其从数据库中删除 > db.movmodels.findOne() { "_id" : ObjectId("55320b0e0e9e0d9d0540593c"), "username" : "punk", "favMovies" : [ { "alternate_ids

这是我在mongodb中的数据。 因为我是mongodb的新手,所以我想知道如何通过查询获取具有特定id的电影。 我尝试的问题是。我需要根据id获取电影,以便将其从数据库中删除

> 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"}}});