MongoDB - 如何在另一个查询之后对foreach进行嵌套查询

时间:2014-08-20 17:01:12

标签: javascript node.js mongodb express foreach

我是Node.js的新手,我接下来要做的是:

在我的模特中,我有" paddocks"这种结构:

{
  _id: ObjectId("53f39dd0ad2f71d36a872cf4"),
  name: "2 animals",
  size: "523",
  latitude: "",
  longitude: "",
  propertyId: "53f39dc9ad2f71d36a872cf3"
}

我有动物,一个围场可以分配多个动物,这样:

{
  _id: "123123",
  propertyId: "53f39dc9ad2f71d36a872cf3",
  paddockId: "53f39dd0ad2f71d36a872cf4",
  breed: "NO",
  groupId: "53f3a28f50364eaa7243c621",
  birthDate: "2014-08-12T03:00:00.000Z",
  gender: "F",
  traceable: "true",
  pureBreed: "true",
  active: "true"
}

我想做的是,对于每个围场,检索动物的数量。 见这一行:

paddock.cattlesQuantity = items.length;

奇怪的是,当每个围场有几只动物时,动物总会返回0。

我做了一个查询的console.log并在mongo控制台上使用了查询,它检索了我的动物,但这样做并没有。

router.post('/paddockListById', function(req, res) {
    var db = req.db;
    var propertyId = req.body.propertyId;

    db.collection('paddock').find({"propertyId": propertyId}).toArray(function (err, paddocks) {
        if(paddocks.length > 0){

            var counter = 0;
            var paddockArray = new Array();

            paddocks.forEach(function(paddock){

                db.collection('animal').find({"paddockId": paddock._id}).toArray(function (err, items) {

                    counter ++;     

                    paddock.cattlesQuantity = items.length;

                    paddockArray.push(paddock);

                    if(counter == paddocks.length){
                        res.send(
                            (err === null) ? { status: 'ok', result: paddockArray } : { status: err }
                        );
                    }
                });
            });
        }
        else{
            res.send(
                (err === null) ? { status: 'ok', result: paddocks } : { status: err }
            );
        }
    });
});

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

验证animals集合中的paddockId是否为ObjectId而不是字符串。如果是这样,要么改变你的第二个查找语句,请使用:

{"paddockId":paddock._id.toString()}

我通过mongoose在ObjectId上使用了toString,并且很确定它只是本机驱动程序ObjectId的直通,但您可能需要检查。

答案 1 :(得分:0)

请注意,您也可以使用简单aggregation pipeline

执行此计算服务器端
> db.animals.insert([
    { "type" : "cow", "says" : "moo", "paddockId" : 1 },
    { "type" : "horse", "says" : "neigh", "paddockId" : 2 },
    { "type" : "sheep", "says" : "baa", "paddockId" : 3 },
    { "type" : "cow", "says" : "moo", "paddockId" : 1 },
    { "type" : "horse", "says" : "neigh", "paddockId" : 3 }
])
> db.animals.aggregate([
    { "$group" : { "_id" : "$paddockId", "count" : { "$sum" : 1 } } }
])
{ "_id" : 3, "count" : 2 }
{ "_id" : 2, "count" : 1 }
{ "_id" : 1, "count" : 2 }