我是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 }
);
}
});
});
有什么想法吗?
答案 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 }