【问题标题】:How to get only one item of a subdocument in mongoose?如何在猫鼬中仅获取子文档的一项?
【发布时间】:2017-06-27 13:17:25
【问题描述】:
ASchema={item:[BSchema]};
ASchema.findOne({item._id=xx})

它得到一个BSchema数组,document.item是一个数组。如何只获取 _id 为 xx 的一项?

【问题讨论】:

    标签: node.js mongodb mongoose mongodb-query


    【解决方案1】:

    您希望使用查询投影的positional $ 运算符仅返回匹配的数组元素。对于 Mongoose,您可以这样做:

    ASchema.findOne({"item._id": itemId},"item.$",function(err,doc) {
        console.log( doc );
    });
    

    或者在一个对象中配对:

    ASchema.findOne({"item._id": itemId},{ "item.$": 1 },function(err,doc) {
        console.log( doc );
    });
    

    Mongoose 支持使用“-fieldname”等选项的速记语法来删除字段,这与{ "fieldname": 0 } 相同。但是除了根 _id 字段之外,您不能混合包含和排除。

    因此,您必须指定使用投影时要显示的所有字段。

    另请参阅猫鼬文档中的.select()

    【讨论】:

      【解决方案2】:

      我认为您的查询语法是错误的。试试:

      ASchema.findOne({'item._id': xx})
      

      此链接有助于获取更多示例:http://mongoosejs.com/docs/queries.html

      【讨论】:

      • 同理。 BSchema 是 ASchema 的子文档,BSchema 不保存在它的集合中,它保存在 ASchema 的子文档中,如 {item:[{_id:1},{_id:2}]
      • ASchema.findOne({'item._id': xx}) 现在为您返回什么?顺便说一句,您是否希望获得查询对象?如果你期待结果,你应该传递一个回调。
      • Lists.findOne({"item._id": itemId }).exec(function(err, docList) { var odds = docList.item.odds; console.log("odd:" + odds); });docList.item 是一个数组,类似于 docList.item[0],docList.item[1],但是 docList.item.odds 是未定义的,只有 docList.item[0]。补充是对的。我必须 forEach 数组来检查我想要哪个项目。
      • 好的,如果这完全无知,请原谅我,但如果 docList.item 是一个数组。 docList.item.odds 属性来自哪里?
      • 另外 - 您应该使用这些附加信息更新您的问题。我认为这对其他试图帮助你的人会有所帮助。
      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 2019-10-06
      • 2021-05-08
      • 2018-06-01
      • 2023-04-07
      • 2016-04-20
      相关资源
      最近更新 更多