【问题标题】:MongoDB - How to make a nested query on a foreach after another queryMongoDB - 如何在另一个查询之后在 foreach 上进行嵌套查询
【发布时间】:2014-08-20 17:01:11
【问题描述】:

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

在我的模型中,我有这种结构的“围场”:

{
  _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 }
            );
        }
    });
});

有什么想法吗?

【问题讨论】:

  • 可能与计数器竞争任务。我写了一个非常相似的循环,尽管它使用了超时功能:pastebin.com/nDbKepnM

标签: javascript node.js mongodb express foreach


【解决方案1】:

验证您的动物集合中的 paddockId 是 ObjectId 而不是字符串。如果是这样,要么更改您的第二个 find 语句,请使用:

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

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

【讨论】:

    【解决方案2】:

    请注意,您也可以使用简单的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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-24
      • 2011-12-05
      • 2019-02-28
      • 1970-01-01
      • 2018-05-03
      相关资源
      最近更新 更多