【问题标题】:Findone for multiple queries not working mongoose [duplicate]Findone 用于多个查询不起作用 mongoose [重复]
【发布时间】:2017-09-20 15:42:07
【问题描述】:

我正在使用带有 nodejs express 框架的猫鼬

这是 mongo 中的文档:

{                                                                        
        "_id" : ObjectId("59c1fe16b68d844d8473c6fe"),                    
        "is_active" : "0",                                               
        "membership_expiry_date" : ISODate("2018-09-20T05:35:18.485Z"),  
        "date_of_joining" : ISODate("2017-09-20T05:35:18.485Z"),         
        "user_name" : "Max M",                                         
        "first_name" : "Max",                                          
        "password" : "MyPwd",                                            
        "address" : "NewTown",                                         
        "email_id" : "max@gmail.com",                                    
        "phone_number" : "12345678901",                                    
        "books_borrowed" : [                                             
                {                                                        
                        "due_date" : ISODate("2017-09-22T05:35:18.511Z"),
                        "book_id" : "1234",                              
                        "is_renewed" : true,                             
                        "_id" : ObjectId("59c1fe16b68d844d8473c700")     
                },                                                       
                {                                                        
                        "due_date" : ISODate("2017-09-22T05:35:18.531Z"),
                        "book_id" : "1235",                              
                        "is_renewed" : false,                            
                        "_id" : ObjectId("59c1fe16b68d844d8473c6ff")     
                }                                                        
        ],                                                               
        "__v" : 0                                                        
}       

现在当我尝试访问 book_borrowed where user_name=Max and book_id=1234 我正在使用

model.findOne({"user_name":"Max M","book_id":1234}, {
        'books_borrowed': 1
    },
    function(err, res) {
        console.log("##Err:: " + JSON.stringify(err) + " response:: " + JSON.stringify(res));
        if (err) {
            return callback('Error while updating...');
        } else {
            return callback(null, res);
        }
    });

这会返回 error = null 并且 response 也是 null。

如果我将 book_id 替换为“books_borrowed.book_id”,那么我会得到 ​​p>

{
  "_id": "59c1fe16b68d844d8473c6fe",
  "books_borrowed": [
    {
      "due_date": "2017-09-22T05:35:18.511Z",
      "book_id": "1234",
      "is_renewed": true,
      "_id": "59c1fe16b68d844d8473c700"
    },
    {
      "due_date": "2017-09-22T05:35:18.531Z",
      "book_id": "1235",
      "is_renewed": false,
      "_id": "59c1fe16b68d844d8473c6ff"
    }
  ]
}

其中还包含 book_id = 1235 的数据。

我只想要包含 book_id=1234 数据的对象。

我在这里缺少什么?此外,我不希望将这些对象 ID 插入到我的 books_borrowed 对象中。

【问题讨论】:

    标签: node.js mongodb express mongoose node-mongodb-native


    【解决方案1】:

    使用它来过滤books_borrowed 结果

    model.findOne({
        "user_name":"Max M",
        "books_borrowed": {
            $elemMatch: {"book_id": "1234"}
        }
    }, 
    {
        "user_name": 1,
        // ... as needed 
        "books_borrowed.$": 1
    });
    

    【讨论】:

    • 感谢 Ryan 这工作,我想了解更多关于 .$ 过滤器的信息 我也是 mongo 和 mongoose 的新手。编辑:: 我错过了你的评论链接谢谢:)
    • 啊,所以问题在于投影我没有添加“user_name”:1 :)
    • 不,查看给定的Max M 数据,有2 个books_borrowed.. @TGW 只想要一个过滤结果;只显示一个作为查询。 :-)
    【解决方案2】:

    您不能直接访问 book_id,因为它位于数组中。 试试这个:

    model.findOne({"user_name":"Max M", books_borrowed: {$elemMatch: {book_id:'1234'}}})
    

    【讨论】:

    • 正如我在问题中已经提到的,如果我将 book_id 替换为 'books_borrowed.book_id' 那么我会得到 { "_id": "59c1fe16b68d844d8473c6fe", "books_borrowed": [ { "due_date": "2017 -09-22T05:35:18.511Z", "book_id": "1234", "is_renewed": true, "_id": "59c1fe16b68d844d8473c700" }, { "due_date": "2017-09-22T05:35:18.531Z ", "book_id": "1235", "is_renewed": false, "_id": "59c1fe16b68d844d8473c6ff" } ] } 它返回数组中的所有内容。
    • @TGW 更新了你不需要第二个参数的答案。
    • 谢谢,但这也无济于事,所以选择 Ryan 的回答 :)
    【解决方案3】:

    您不能直接在查询中调用 book_id,因为它不在主文档中。您需要获取所有借阅的Books,然后过滤“books_borrowed”以获取所需的文档。

    model.findOne({"user_name":"Max M","books_borrowed":{$elemMatch:{"book_id":"1234"}}, {
        'books_borrowed': 1
    },
    function(err, res) {
        // Your code here
    });
    

    【讨论】:

    • 同意,使用$elemMatch,但要注意book_idString 而不是Int
    • 嗯,这给了我 null 错误以及响应
    • 我已将日志放入回调中,这就是我得到的:err::null res::null,正如 Ryan 提到的,我也尝试将其作为字符串,但仍然相同对不起,我的错误我使用了不正确的名称,但它仍然给了我 books_borrowed 数组中的所有元素。
    • 检查您的辅助参数; {'books_borrowed': 1}...仅此一项就可以工作model.findOne({"user_name":"Max M","books_borrowed":{$elemMatch:{"book_id":"1234"}}});
    • 我已经编辑了我的答案。 book_id 的类型是 String 而不是 int。立即尝试
    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多