【问题标题】:Grabbing only one object out of an array of objects从一组对象中只抓取一个对象
【发布时间】:2018-09-12 10:24:34
【问题描述】:

我正在使用 MongoDB,我正在尝试根据其 _id 以及所有同级元素来获取特定对象。例如我的数组如下所示:

"blogs": [
    {
        "body": "default valuee",
        "header": "another first",
        "_id": "1234"
    },
    {
        "body": "second default value",
        "header": "second",
        "_id": "5678"
    }
]

我正在尝试获取 1234 的 _id 旁边的值(因此只是该对象的 body、header 和 _id 字段)。我尝试了一些 Mongo 查询,但没有这样的运气。任何帮助都会很棒,干杯

我的功能是:

module.exports = function findBlog(db, id, callback){

var UserCollection = db.collection('users') //connect to business collection

UserCollection.findOne({ 'blogs._id': id }, {body: 1, header: 1, _id: { $elemMatch: { _id: id}}},function (err, user) {

    if (err){
        return callback({response: "3"})                              
    }else if(!user){
        return callback({response: "4"})
    }else {
        return callback({response: "2",data:user.blogs})
    }
  });
}

【问题讨论】:

  • 您使用的是任何特定语言还是仅使用 CLI?看看 MongoDB 文档specify-equality-condition
  • 嗨,我正在使用 NodeJs、Express、mongoose 作为后端。我正在尝试为我的 findblog 函数编写查询
  • 您能否编辑您的问题并添加您目前拥有的代码(用于您的 findBlog 功能)?
  • 我刚刚添加了函数
  • 你有博客方案吗?为什么要通过用户集合通过 id 获取特定博客?

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


【解决方案1】:

你应该使用这样的东西,

如果您想要博客和用户中的所有字段,您可以直接使用

UserCollection.find({ 'blogs._id': id },  { blogs:{ $elemMatch:{ _id: id }}},function (err, user) {
        if (err){
            return callback({response: "3"})
        }else if(!user){
            return callback({response: "4"})
        }else {
            return callback({response: "2",data:user.blogs})
        }
      });
 }

如果您需要特定字段:

您将添加条件的第一个参数:{ 'blogs._id': id } 您将添加必填字段的第二个参数:{ "blogs.body": 1,"blogs.header": 1 }

UserCollection.findOne({ 'blogs._id': id }, { "blogs.body": 1,"blogs.header": 1 },function (err, user) {
    if (err){
        return callback({response: "3"})
    }else if(!user){
        return callback({response: "4"})
    }else {
        return callback({response: "2",data:user})
    }
  });
}

【讨论】:

  • 您好,感谢您的回答,但是 data:user 的回调返回所有用户对象,其中包括 blogs 数组中的所有对象
  • 你得到所有用户了吗?或只有拥有该博客的用户
  • 我只有一个用户,所以它只是返回 blogs 数组所在的那个用户的整个个人资料。
  • UserCollection.find({ 'blogs._id': id }, { blogs:{ $elemMatch:{ _id: id }}}
  • 您好,感谢您的帮助,我想我只是要为博客创建一个集合,因为事情可能会更容易 - 不过感谢您的帮助!
【解决方案2】:

正如我在对 OP 问题的评论中所述,解决此问题的最佳方法是创建一个博客集。然后,您可以直接查询此集合,而不是查询 User 集合。

通过将博客链接到用户,您仍然可以在用户模型中拥有 blogs 属性。 (请参阅 populate 上的 Mongoose 文档)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2018-06-14
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多