Ваша структура запроса mgo
в порядке, проблема в названии поля count
. Модель ожидает Value
:
var result []struct {
Status string `bson:"_id"`
Value int
}
Так что измените стадию $group
на следующую:
grp := bson.M{
"$group": bson.M{
"_id": "$status",
"value": bson.M{ // Note lowercased "value"!
"$sum": 1,
},
},
}
И это должно сработать. Или измените модель, если вы можете:
var result []struct {
Status string `bson:"_id"`
Value int `bson:"count"`
}
Только один из них должен быть изменен, чтобы быть согласованным с другим.
И последнее: если вы используете Query.One()
, то result
не должен быть срезом (One()
ожидает только один документ).
Используйте тип среза для result
, если вы используете, например, Query.All()
.
Поэтому, если вы собираетесь использовать Query.One()
, используйте результат:
var result struct {
Status string `bson:"_id"`
Value int `bson:"count"`
}
Также Query.One()
и Query.All()
возвращают ошибку, проверьте ее!
DECLARE @tmp_key int
DECLARE @get_invckey cursor
SET @get_invckey = CURSOR FOR
SELECT invckey FROM tarinvoice WHERE confirmtocntctkey IS NULL AND tranno LIKE '%115876'
OPEN @get_invckey
FETCH NEXT FROM @get_invckey INTO @tmp_key
DECLARE @PrimaryContactKey int --or whatever datatype it is
WHILE (@@FETCH_STATUS = 0)
BEGIN
SELECT @PrimaryContactKey=c.PrimaryCntctKey
FROM tarcustomer c, tarinvoice i
WHERE i.custkey = c.custkey AND i.invckey = @tmp_key
UPDATE tarinvoice SET confirmtocntctkey = @PrimaryContactKey WHERE invckey = @tmp_key
FETCH NEXT FROM @get_invckey INTO @tmp_key
END
CLOSE @get_invckey
DEALLOCATE @get_invckey
EDIT:
This question has gotten a lot more traction than I would have anticipated. Do note that I'm not advocating the use of the cursor in my answer, but rather showing how to assign the value based on the question.
Зачем вообще нужен курсор? Весь ваш сегмент кода может быть заменен этим, который будет работать намного быстрее на большом количестве строк.
UPDATE tarinvoice set confirmtocntctkey = PrimaryCntctKey
FROM tarinvoice INNER JOIN tarcustomer ON tarinvoice.custkey = tarcustomer.custkey
WHERE confirmtocntctkey is null and tranno like '%115876'
Попробуйте это
SELECT @PrimaryContactKey = c.PrimaryCntctKey
FROM tarcustomer c, tarinvoice i
WHERE i.custkey = c.custkey
AND i.invckey = @tmp_key
UPDATE tarinvoice SET confirmtocntctkey = @PrimaryContactKey
WHERE invckey = @tmp_key
FETCH NEXT FROM @get_invckey INTO @tmp_key
Вы бы объявили эту переменную вне вашего цикла как просто стандартную переменную TSQL.
Я также должен отметить, что это как бы вы делали это для любого типа выбора в переменной, а не только для работы с курсорами.