Arrays 在查询中为字段和嵌套对象中的字段设置条件

Arrays 在查询中为字段和嵌套对象中的字段设置条件,arrays,node.js,mongoose,Arrays,Node.js,Mongoose,我有这样一份文件: { "InDate": "11.09.2015", "Kst2Kst": true, "OutDate": "11.09.2015", "__v": 0, "_id": ObjectId('55f2df2d7e12a9f1f52837e6'), "accepted": true, "inventar": [ { "accepted": "1", "name"

我有这样一份文件:

{
    "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"
        }
    ]
}
> db.MyDB.findOne({{accepted : true, "inventar.isstammkost" : true}, {"inventar.isstammkost.$": 1});
我想在inventar数组中选择带有“isstammkost”:true的数据

我的问题是:

Move.findOne({accepted : true, 'inventar.isstammkost' : true}, 
'OutDate InDate inventar.name', function(err, res)
它不工作->它选择所有,即使使用inventar.isstammkost:false。
“普通”查询的工作方式与我想要的一样(子数组中没有条件)。在子数组中设置条件的正确方法是什么?

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

我对nodejs的速度不是很快,但如果这是mongo shell,它会是这样的:

{
    "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"
        }
    ]
}
> db.MyDB.findOne({{accepted : true, "inventar.isstammkost" : true}, {"inventar.isstammkost.$": 1});

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

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

我对nodejs的速度不是很快,但如果这是mongo shell,它会是这样的:

{
    "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"
        }
    ]
}
> db.MyDB.findOne({{accepted : true, "inventar.isstammkost" : true}, {"inventar.isstammkost.$": 1});

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

它从mongodb查找/返回多个文档,即使您使用的是findOne()?你在mongo shell中尝试过同样的查询吗?我不知道你想说什么。查询结果很好,但忽略了条件“inventar.isstammkost”:true。我想知道在数组中设置条件的正确方法。没关系,我意识到我犯了与您可能犯的相同的错误。这是从mongodb中查找/返回多个文档,即使您使用findOne()?你在mongo shell中尝试过同样的查询吗?我不知道你想说什么。查询结果很好,但忽略了条件“inventar.isstammkost”:true。我想知道在数组中设置条件的正确方法。没关系,我意识到我犯了与您可能犯的相同的错误。它不起作用
Move.findOne({tablename:tablename,accepted:true,“inventar.isstammkost”:true},'OutDate InDate',{“inventar.isstammkost.$”:1},函数(err,res){…
它仍然给出了inventar.isstammkost:false的结果我无法找到一个解决方案让它与mongoose一起工作。给出了理论上的答案,但到目前为止还不起作用…即使使用聚合,我也无法让它工作!
var管道=[{“$match”:{“接受”:true,“inventar.isstammkost”:false},{$project:{tablename:1,accepted:1,“inventar:1}}}]
根据[Mongoose docs][1],.findOne()返回值为false的结果可以将投影作为第二个参数,但在这里的第一个注释中,您将其作为第三个参数。您是否尝试过不使用作为第二个参数的“过期InDate”?例如,
Move.findOne({tablename:tablename,accepted:true,“inventar.isstammkost”:true},{inventar.isstammkost.$”:1},函数(err,res){blargh();});
[1]:它不工作
Move.findOne({tablename:tablename,accepted:true,“inventar.isstammkost”:true},'OutDate InDate',{“inventar.isstammkost.$”:1},函数(err,res){…
它仍然给出了inventar.isstammkost:false的结果我无法找到一个解决方案让它与mongoose一起工作。给出了理论上的答案,但到目前为止还不起作用…即使使用聚合,我也无法让它工作!
var管道=[{“$match”:{“接受”:true,“inventar.isstammkost”:false},{$project:{tablename:1,accepted:1,“inventar:1}}}]
根据[Mongoose docs][1],.findOne()返回值为false的结果可以将投影作为第二个参数,但在这里的第一个注释中,您将其作为第三个参数。您是否尝试过不使用作为第二个参数的“过期InDate”?例如,
Move.findOne({tablename:tablename,accepted:true,“inventar.isstammkost”:true},{inventar.isstammkost.$”:1},函数(err,res){blargh();});
[1]: