Как присвоить избранный результат переменной?

Ваша структура запроса 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() возвращают ошибку, проверьте ее!

70
задан tshepang 23 February 2014 в 17:38
поделиться

3 ответа

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.

45
ответ дан 24 November 2019 в 13:17
поделиться

Зачем вообще нужен курсор? Весь ваш сегмент кода может быть заменен этим, который будет работать намного быстрее на большом количестве строк.

UPDATE tarinvoice set confirmtocntctkey = PrimaryCntctKey 
FROM tarinvoice INNER JOIN tarcustomer ON tarinvoice.custkey = tarcustomer.custkey
WHERE confirmtocntctkey is null and tranno like '%115876'
14
ответ дан 24 November 2019 в 13:17
поделиться

Попробуйте это

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.

Я также должен отметить, что это как бы вы делали это для любого типа выбора в переменной, а не только для работы с курсорами.

19
ответ дан 24 November 2019 в 13:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: