【问题标题】:Set criteria in query for fields and fields in nested objects为嵌套对象中的字段和字段设置查询条件
【发布时间】:2015-12-08 04:53:45
【问题描述】:

我有这样的文件:

{
    "InDate": "11.09.2015",
    "Kst2Kst": true,
    "OutDate": "11.09.2015",
    "__v": 0,
    "_id": ObjectId('55f2df2d7e12a9f1f52837e6'),
    "accepted": true,
    "inventar": [
        {
            "accepted": "1",
            "name": "AAAA",
            "isstammkost": true,
            "stammkost": "IWXI"
        },
        {
            "accepted": "1",
            "name": "BBBB",
            "isstammkost": false,
            "stammkost": "null"
        }
    ]
}

我想在 inventar-array 中选择带有 "isstammkost": true 的数据。

我的查询是:

Move.findOne({accepted : true, 'inventar.isstammkost' : true}, 
'OutDate InDate inventar.name', function(err, res)

它不起作用 -> 它选择所有,即使使用 inventar.isttammkost : false。 “正常”查询像我想要的那样工作(子数组中没有条件)。在子数组中设置条件的正确方法是什么?

【问题讨论】:

  • 它正在从您的 mongodb 中查找/返回多个文档,即使您使用的是 findOne()?您是否在 mongo shell 中尝试过等效查询?
  • 我不知道你想说什么。查询结果很好,但条件 "inventar.isttammkost" : true 被忽略。我想知道在数组中设置条件的正确方法。
  • 没关系,我意识到我正在犯同样的错误。

标签: arrays node.js mongoose


【解决方案1】:

当然它会返回 "isstammkost": false 部分,因为它与 "isstammkost": true 是同一文档的一部分。它们都是数组“inventar”中的对象,数组是单个文档中的顶级字段。如果没有某种projection整个文档将始终返回到 mongodb 查询,因此 nodejs 会将它们传递给您。

我不是很了解 nodejs,但如果这是 mongo shell,它看起来像这样:

> db.MyDB.findOne({{accepted : true, "inventar.isstammkost" : true}, {"inventar.isstammkost.$": 1});

您需要了解如何将该额外参数添加到 nodejs 函数。

【讨论】:

  • 它不起作用Move.findOne({tablename: tablename, accepted : true, "inventar.isstammkost" : true}, 'OutDate InDate', {"inventar.isstammkost.$": 1}, function(err, res) {... 它仍然给出inventar.isstammkost: false 的结果
  • 我无法找到一个解决方案来让它与猫鼬一起工作。 mongoosejs.com/docs/api.html#model_Model.findOne 给出了理论上的答案,但到目前为止还没有工作......
  • 即使使用聚合我也无法让它工作! var pipeline = [{"$match":{"accepted":true,"inventar.isstammkost":false}},{ $project : { tablename : 1 , accepted : 1 , "inventar" : 1} }] 以假值返回结果
  • 根据 [Mongoose docs][1],.findOne() 可以将投影作为第二个参数,但在您在这里的第一条评论中,您将其作为第三个参数。您是否尝试过没有将“OutDate InDate”作为第二个参数?例如。 Move.findOne({tablename: tablename, accepted : true, "inventar.isstammkost" : true}, {"inventar.isstammkost.$": 1}, function(err, res) {blargh();});[1]:mongoosejs.com/docs/api.html#model_Model.findOne
猜你喜欢
  • 2017-06-27
  • 2019-05-17
  • 2011-12-24
  • 2020-10-10
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-19
相关资源
最近更新 更多